Docker常用命令
注意
1、一般使用 容器 id
\ <CONTAINER ID>
的地方都可以用 容器名
代替。
2、docker 使用映射关系时[ a:a ],前面代表宿主机,后面的代表 docker 容器环境。
3、有些服务更改了配置,不会立即生效。需要重启容器(先 docker stop <CONTAINER ID>
然后 docker start <CONTAINER ID>
)才会生效,或者 重载配置
(有些服务支持重载例如重载 nginx 配置:docker exec <CONTAINER ID> nginx -s reload
)。
# docker 基本命令
进入到启动的容器中:docker exec -it <CONTAINER ID> /bin/bash
进入到mysql终端:docker exec -it <CONTAINER ID> mysql -u root -p
拷贝容器里面的文件到宿主机中:docker cp <CONTAINER ID>:/etc/nginx /etc/nginx
拷贝宿主机的文件到容器中:docker cp /etc/nginx <CONTAINER ID>:/etc/nginx
停止容器:docker stop <CONTAINER ID>
删除容器:docker rm <CONTAINER ID>
停止并删除容器:docker rm -f <CONTAINER ID>
删除镜像:docker rmi <IMAGE ID>
查看日志:docker logs [-f] <CONTAINER ID> # 使用-f时,可以持续打印新的日志信息到终端
守护态运行:docker run -d nginx
镜像重命名:docker tag <IMAGE ID> REPOSITORY:TAG # REPOSITORY:自定义名字,TAG:自定义标签。这里不是创建一个新的镜像,而是引用。
2
3
4
5
6
7
8
9
10
11
12
13
# volume 数据卷
docker volume create my-db # 创建my-db数据卷
docker run -dp 3000:3000 -v my-db:/etc/todos getting-started # 挂载数据卷到容器
docker volume ls # 查看所有的数据卷
docker volume inspect my-db # 查看数据卷详情
# 如果没有创建数据卷,在命令行运行容器并且进行了路径挂载的话,docker会自动创建该数据卷。-v todo-data:/data/test
# 如果是用compose,不会自动创建数据卷,需要定义好数据卷,然后compose才会创建数据卷。
2
3
4
5
6
# 目录挂载:-v
注意:需要用绝对路径
-v "$(pwd):/app" # 绑定当前目录到容器的 /app 目录
docker run -it -v /etc/nginx:/etc/nginx nginx /bin/bash
多个挂载: [-v /demo:/demo -v /test:/test]
2
3
4
# 端口映射:-p \ -P
# 冒号前面端口是 宿主机 端口,冒号后面的端口是 容器 端口
-p:具体的端口映射
单个端口映射: [-p 80:80]
多个端口映射: [-p 80:80 -p 81:81]
多个连续端口: [-p 90-93:80-83]
-P:随机映射,不建议使用
单个端口随机映射: [-P 80]
所有端口随机映射: [-P]
查看容器映射的端口: docker port <CONTAINER ID>
2
3
4
5
6
7
8
9
10
11
# 启动 docker 的时候自动启动容器:--restart
运行容器的时候加入自启动: [--restart always]
关闭已经开启自启动的容器: docker update --restart=no <CONTAINER ID>
未开启自启动的容器打开自启动: docker update --restart=always <CONTAINER ID>
2
3
# 使用容器制作镜像
# 默认 TAG 是 latest
docker commit <CONTAINER ID> <镜像名>
# 自定义 TAG(版本)
docker commit <CONTAINER ID> <镜像名>:<TAG>
# 案例:基于 nginx 容器创建一个 nginx_new 1.0 的镜像
docker commit nginx nginx_new:1.0
2
3
4
5
6
7
8
# 容器间通信 network
官方文档 network (opens new window)
# network 基本命令
如果容器在同一个网络中,可以相互通信。
docker network craete todo-app # 创建一个网络
docker network ls # 查看网络列表
docker network --help # 查看命令的帮助信息
2
3
4
# 使用 network
# --network-alias : 在后面使用mysql时需要知道mysql容器的ip,使用该参数docker可以映射到ip,直接使用mysql即可。
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.6
# 连接到上面创建的mysql
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# docker-compose
官方文档 docker-compose (opens new window)
# 介绍
docker-compose version # 查看版本信息
# 查看下面 docker-compose.yml 文件
version # 定义版本
services # 定义容器列表
volumes # 定义数据卷
docker-compose up -d # 运行compose,-d表示在后台运行,--build 会编译镜像然后启动
docker-compose down # 移除compose,不会自动删除数据卷,需要手动删除
docker-compose logs -f # 查看compose的日志
docker-compose logs -f mysql # 查看指定service的日志
2
3
4
5
6
7
8
9
# docker-compose.yml
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql: # 类似于 --network-alias
image: mysql:5.6
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Dockerfile
官方文档 Dockerfile (opens new window) | Docker 构建 (opens new window)
FROM # 镜像引用,推荐使用Alpine映像
LABEL # 指令用来给镜像添加一些元数据
RUN # 用于执行后面跟着的命令行命令,RUN 是在 docker build运行。
CMD # 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同,CMD 在docker run 时运行。 可被 docker run 命令行参数中指定要运行的程序所覆盖。
# 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。 CMD ["<可执行文件或命令>","<param1>","<param2>",...],可以配置变参,不传就使用默认参数。
ENTRYPOINT # 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 可以配置定参。
EXPOSE # 仅仅只是声明端口
ENV # 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
# ENV PG_MAJOR=9.3
# ENV PATH=/usr/local/postgres-$PG_MAJOR/bin:$PATH
COPY # 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。 COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
ADD # ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
# ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
# ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
VOLUME # 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 作用:1.避免重要的数据,因容器重启而丢失,这是非常致命的。2.避免容器不断变大。
USER # 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。 USER <用户名>[:<用户组>]
WORKDIR # 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
# docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
ONBUILD # 用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。
# 当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
构建容器映像: docker build -t <镜像名[:镜像标签]> .
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 导出/导入镜像
注意
两种方法不可混用。如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
- 不支持同时将多个镜像打包到一个文件中
- 支持为镜像指定新名称
- export 导出的镜像文件体积小于 save 保存的镜像
- 不包含镜像历史,无法进行回滚操作
# 导出镜像为 docker_nginx.tar 文件
docker export [IMAGE ID] > docker_nginx.tar
# 导入,如果不输入镜像名导入以后为 <none>
docker import - [镜像名] < docker_nginx.tar
2
3
4
5
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
- 支持同时将多个镜像打包到一个文件中
- 不支持为镜像指定新名称
- save 导出的镜像文件体积大于 export 保存的镜像
- 包含镜像历史,可以回滚到之前的层(layer)
# 导出镜像为 docker_nginx.tar 文件
docker save [IMAGE ID] > docker_nginx.tar
# 导入,导入的镜像名跟导出时保持一致。推荐使用
docker load < docker_nginx.tar
2
3
4
5
// Make sure to add code blocks to your code group