PancrasL的博客

Docker 快速入门

2021-07-07

img

QuickStart

1
2
3
4
5
6
7
8
9
10
11
12
# 启动mysql5.7,并将D盘的mysql57/data/文件夹挂载到容器中作为mysql的数据保存位置
$ docker run --name=mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /D/mysql57/data:/var/lib/mysql -d mysql:5.7

# 启动redis
$ docker run -d --name=redis6 -p 6379:6379 redis:6.2.2

# 启动zookeeper
$ docker run -d --name=zookeeper -p 2181:2181 zookeeper:3.6.3

# minio
$ docker run -p 9000:9000 --name minio -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=minioadmin" -v E:/Movie:/data minio/minio server /data --console-address ":9001"
$ minio.exe server E:/minio --console-address ":9001"

1. Docker的优点

更快的交付应用程序

应用程序和环境一起发布,使得开发、测试和运维之间避免了许多因环境导致的问题。

减少了许多环境搭建工作,软件开发更加迅速。

快速部署:Build,ship and Run Any App,Anywhere

部署和拓展更加容易

docker容器几乎可以在所有环境中运行,包括台式机、物理服务器、虚拟机、数据中心。

docker容器具备可移植性,能很方便地从本地的测试环境部署到云中。

docker容器仅具有秒级地启动时间,可以在需要时快速启动更多容器,在不再需要时关闭它们。

运行更多的负载

相对于虚拟机,docker更加轻量,同一台物理设备上可以运行更多的负载。

资源隔离

容器技术解决了不同应用之间的潜在依赖冲突问题。

2. Docker命令

  • 构建镜像
1
$ docker build -t provider:latest .
  • 搜索镜像
1
$ docker search xxx
  • 运行容器
1
$ docker run --name=test -it provider:latest -p 7998:7998
  • 删除所有容器
1
$ docker rm $(docker ps -aq)
  • 启动容器交互界面
1
$ sudo docker run -t -i ID /bin/bash
docker run 运行容器
–name NAME 为创建的容器命名
-i 保证容器的stdin是开启的
-t 为容器分配一个伪tty终端
-v 将宿主机的目录作为卷,挂在到容器里,-v src:dest,本地目录必须是绝对路径,且挂载的是目录
–network 指定新容器将会在哪个网络中运行
-rm 容器运行完毕后即删除
-h 指定容器的主机名
ubuntu:xxx 创建容器的镜像
/bin/bash 创建容器后执行的命令

3. Dockerfile

3.1 RUN

作用:在构建容器时运行的命令,常用于安装依赖,构造容器运行环境

1
2
3
RUN ["可执行文件", "参数1", "参数2"]
# 等价于 RUN apt install python3-pip
RUN ["apt", "install", "python3-pip"]

3.2 CMD

作用:类似于 RUN 指令,会被 docker run 附带的命令行参数覆盖

  • CMD 在docker run 时运行。
  • RUN 是在 docker build 时运行。
1
2
3
CMD <shell 命令> # CMD echo $PWD
CMD ["<可执行文件或命令>","<param1>","<param2>",...] # CMD python3 test.py
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

3.3 ENTRYPOINT

作用:类似于 CMD 指令,但不会被 docker run 的命令行参数指定的指令所覆盖。

1
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

示例:

1
2
3
4
FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

1、不传参运行

1
$ docker run nginx:test

容器内会将CMD拼接在ENTRYPOINT后面,默认运行以下命令:

1
$ nginx -c /etc/nginx/nginx.conf

2、传参运行

1
$ docker run nginx:test -c /home/user/new.conf

容器内会使用传入的参数替换掉CMD,运行一下命令:

1
$ nginx -c /home/user/new.conf

3.4 COPY

作用:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

1
2
COPY <源路径1>...  <目标路径>
COPY ["<源路径1>",... "<目标路径>"]

**<源路径>**:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

1
2
COPY hom* /mydir/
COPY hom?.txt /mydir/

**<目标路径>**:容器内的绝对路径表示,该路径不用事先建好,路径不存在的话,会自动创建。

3.5 ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

3.6 ENV

设置环境变量,在后续的指令中,可以通过 $<key> 使用这个环境变量。

1
2
3
4
# 格式1
ENV <key> <value>
# 格式2
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

1
2
3
ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"

3.7 ARG

作用:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

1
ARG <参数名>[=<默认值>]

3.8 WORKDIR

作用:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

1
WORKDIR <工作目录路径>

3.9 VOLUME

作用:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

1
2
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

3.10 EXPOSE

作用:声明端口。

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
1
EXPOSE <端口1> [<端口2>...]

3.11 USER

作用:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

1
USER <用户名>[:<用户组>]