E

EdwardWong

V1

2022/08/29阅读:38主题:兰青

Docker

此文简单的介绍了docker的使用,由于初学,之后会陆续添加内容。

容器


  • one way to package applciation with all the necessary dependency and configuration
  • portable artifact, easy shared and move around
  • make development and deployment more efficient

简而言之,docker可以使你免受环境配置的困扰。

容器和镜像的区别: 镜像就是实际的安装包,而容器就是运行的安装包,就是程序和运行的程序的区别。镜像一般存放在私人仓库或者公共仓库中,Docker Hub存放了多个版本的仓库源。

也可以使用docker search 命令来搜索镜像。

有时候我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以用以下方式对镜像进行更改:

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用dockerfile指令创建新的镜像

在已有的镜像源基础上更新镜像源


  1. docker run -it ubuntu:15.10 /bin/bash
  2. 运行apt-get update 或者做其他配置 % 比如容器中无ping命令,可以添加进去然后形成新的镜像。
  3. docker commit -m="has update" -a="edward" based containerid edward/ubuntu:v2
  • m:提交的描述信息
  • a: 指定镜像作者
  • based container ID 基于那个容器生成
  • edward/ubuntu:v2 指定要创建的目标镜像名

从零创建镜像源(需要dockerfile)

Dockerfile的基本格式如下:

FROM centos:6.7             % 指定使用哪一个镜像源
MAINTAINER Fisher "fisher@sudops.com" % 维护者
% 在docker镜像内执行的命令
RUN /bin/echo "root:123456" |chpasswd
RUN useradd edward
RUN /bin/echo "edward:123456" |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin.sshd -D

创建了上述Dockerfile后,可以使用docker build -t edward/centos:6.7 -t指定要创建的目标镜像名 可以为镜像添加一个新的标签:docker tag containerID edward/centos:dev,这会为containerID创建一个dev的标签。

Docker的基本命令


  1. docker ps : 列出本地上正在运行的container
  2. docker ps -a: 列出所有正在运行和停止的images docker ps -l: 查看最后一次创建的容器
  3. docker images: 列出已经安装的images
  4. docker pull postgres:9.6: 把postgresql9.6 拉取到本地
  5. docker run postgres:9.6: 会将镜像下载到本地并运行 docker run=docker pull+ docker start
  6. docker run -d postgres: detach mode运行,即后台运行
  7. docker stop + container ID or docker stop -t=10+ containerID: 停止某个正在运行的容器或者10s后关闭容器
  8. docker start/restart + container ID: 开始/重启某个容器
  9. docker logs container ID: 显示某个容器的日志
  10. docker network ls: 列出所有的network id
  11. docker network create -d bridge +网络名: 创建一个网络

docker network create -d bridge test-net -d: 参数指定Docker网络类型,有bridge、overlay

  1. docker run -d -p 8081:8081 -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin -e ME_CONFIG_MONGODB_ADMINPASSWORD=password -e ME_CONFIG_MONGODB=mongodb --net mongo-network --name mongo-express mango : % --name指定了container的名称, --network指定了网络, -e指定了环境变量 -p指定了端口映射, -P是端口随机映射, 第一个8081是本机的端口,第二个8081是容器的端口
  2. docker rmi ImageID: 删除iamge,在删除时需要将相关的运行的容器停止运行
  3. docker rm ContainerID: 删除容器
  4. docker run -it ubuntu :15.10: 在容器内部打开终端并进行交互式命令 -i 是交互 -t 是进入终端
  5. exit: 退出容器
  6. 当进入后台运行时,可以使用docker exec -it containerID + command 或者docker attach containerID,区别在于使用attach 会在退出容器后停止容器,而使用exec在退出后不会导致容器的停止。
  7. docker export containerID > ubuntu.tar: 导出本地容器到本地文件ubuntu.tar
  8. docker ps -a 或者docker port: 可以查看指定容器的额某个确定端口映射到宿主机的端口号
  9. docker top +containerID/name: 可以查看容器内部运行的进程
  10. docker push: 推送镜像到docker hub
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04

Docker容器的状态


有七种状态:

  • created(已创建)
  • restarting(重启中)
  • runing或者up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

Container port vs Host port

在本地机器上端口号是有限的,要注意几个正在运行的container端口号不能映射到本地相同的端口号,否则会冲突, 但是对于不同容器的端口号可以相同。 端口的绑定默认是tcp,如果要使用udp则需要在端口后面加上/udp 可以通过docker port contianerID 端口号查看端口的绑定情况

容器互连

  1. 新建网络 docker network create -d bridge test-net
  2. 连接容器
  • 运行一个容器并连接到新建的test-net网络上 docker run -itd --name test1 --network test-net ubuntu /bin/bash

  • 在运行一个容器并加入test-net网络 docker run -itd --name test2 --network test-net ubuntu /bin/bash

这样两个容器之间就加入了同一个网络,从而可以实现数据共享,可以ping通。

docker exec -it test1 /bin/bash
ping test2

Dockerfiles

Dockerfile是用来构造镜像的文本文件,包含了一条构建所需的指令和说明

FROM nginx
RUN echo "这是一个本地构建的nginx镜像" > /usr/share/nginx/html/index.html
% RUN 有两种格式
1. RUN <命令行>等同于在终端执行shell命令

2. RUN ["可执行文件", “参数1”,“参数2”]
如 RUN ["./test.php", "dev","offline"] 等价于 RUN ./test.php dev offline

docker 每执行一次命令都会在下一层的基础上新建一层,所以过多无意义的层会造成镜像膨胀,可以使用&&连接命令

docker的运行模式是C\S模式,docker无法使用我们本地的文件,需要我们把本机指定目录下的文件一起打包提供给docker使用。 比如 docker build -t nginx:v3 . 是把本地.目录下的文件一起打包,如果没有指定,则默认是Dockerfile所在的位置。

COPY命令: 与RUN的区别是RUN是在镜像构建的时候运行的,而COPY是程序在运行的时候执行的程序。

COPY .(本地源文件) /home/app(容器内目标文件): 把当前目录下的文件copy到容器中的/home/app中。

CMD 命令: CMD ["可执行的文件/命令",“参数1”,“参数2”,...] docker默认要运行的程序,如果Dockerfile中如果存在多个指令,仅最后一个生效。CMD指令指定的程序可被docker run命令行参数中指定的程序覆盖。

ENTRYPOINT命令

  • 命令格式类似于COPY,不同的是不会被RUN命令行参数指定的参数覆盖,而且命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。
  • 当存在多个ENTRYPOINT命令时仅最后一个生效

EXPOSE命令 声明端口。起作用是:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
  • 在运行时使用随机端口映射时,会自动随机映射EXPOSE的端口。

如果退出docker后,数据会丢失,这是很得不偿失的,所以可以将容器挂在在本地的文件系统中,起作用是:

  • 避免重要的数据因容器重启而丢失
  • 避免容器的不断变大
VOLUME ["路径1",“路径2”] 或者 VOLUME <路径>

也可以在启动容器的时候通过-v参数修改挂载点。docker -v /home/mount/data(host 文件):/var/lib/mysql/data(容器的文件)docker -v /var/lib/mysql/data(不建议使用)docker -v name:/var/lib/mysql/data

Compose文件

使用Compose的三个步骤

  • 使用Dockerfile定义应用程序的环境
  • 使用docker-compose.yml定义构成应用程序的服务,这样他们可以在隔离环境中一起运行。
  • 最后执行docker-compose up 命令来启动并运行整个应用程序。

复杂的compose文件设置可以参考

分类:

后端

标签:

后端

作者介绍

E
EdwardWong
V1