docker实践指南

docker实践指南

镜像操作

获取镜像 docker pull

1
2
# docker pull 从镜像仓库中拉取或者更新指定镜像
docker pull ubuntu:18.04

列出已经下载的镜像 docker images

1
2
3
docker images
# 列出某一个镜像
docker images ubuntu

删除镜像 docker rmi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker rmi 501
# or
docker rmi centos

# docker prune命令
# 删除所有未被tag标记或者未被容器使用的镜像
docker image prune
# 删除所有未被容器使用的镜像
docker image prune -a
# 删除所有停止运行的容器
docker container prune
# 删除所有未被挂载的卷
docker volume prune
# 删除所有网络
docker network prune
# 删除docker所有资源
docker system prune

上传镜像 docker push

1
2
# docker push:将本地的镜像上传到镜像仓库,先登录镜像仓库
docker image push mynode:v1

save镜像

docker image save nginx:1.20.0 -o nginx.name

load镜像

docker image load -i ./nginx.name

容器操作

列出容器 docker ps

1
2
# -a :显示所有的容器,包括未运行的
docker ps

停止容器 docker stop

1
2
# 停止运行中的容器myrunoob
docker stop myrunoob

启动容器 docker start

1
2
# 启动已被停止的容器myrunoob
docker start myrunoob

重启容器 docker restart

1
2
# 重启容器myrunoob
docker restart myrunoob

删除容器 docker rm

1
2
# 强制删除容器 db01、db02
docker rm -f db01 db02

查看容器信息 docker inspect

1
2
3
# 获取容器/镜像的元数据
# 获取镜像mysql:5.6的元信息
docker inspect mysql:5.6

查看容器中运行的进程信息

1
docker contaienr top [id]

查看容器日志 docker logs

1
2
# 跟踪查看容器mynginx的日志输出
docker logs -f mynginx

进入容器控制台 docker exec

1
2
3
4
5
6
7
// 在运行的容器中执行命令
// -d:分离模式,在后台运行
// -i: 即使没有附加也保持STDIN打开
// -t: 分配一个伪终端
// docker exec -it <container-id> /bin/sh

// 执行 exit 退出

启动 docker

1
open /Applications/Docker.app

docker run

eg1:

1
docker run ubuntu:15.10 /bin/echo 'hello world'

各个参数解析:

  • docker:Docker 的二进制执行文件

  • run:与 docker 组合来运行一个容器

  • ubuntu:15.10 指定要运行的景象,docker 先从本地主机查找景象是否存在,如不存在,docker 就会从 Docker hub镜像仓库下载公共镜像

  • /bin/echo ‘hello world’:在启动的容器中执行的命令

注意:

  • 不存在时会出现错误信息: Unable to find image ‘ubuntu:15.10’ locally

  • 之后便会从镜像仓库下载公共镜像

  • 打印 hello world

  • M1-Mac 可能会出现如下警告:WARNING: The requested image’s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

    • 解决方法:docker run –platform linux/amd64 ubuntu:15.10 /bin/echo ‘hello world’

eg2:

1
2
3
4
5
6
// 启动容器 docker run -p xxx:xxx -v=hostPath:containerPath -d --name <container-name> <image-name>
// -p 端口映射
// -v 数据卷,文件映射
// -d 后台运行
// --name 定义容器名称
docker run -p 81:80 -d --name nginx1 nginx

Dockerfile

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#Dockerfile
FROM node:latest
WORKDIR /app
COPY . /app

RUN npm set registry https://registry.npm.taobao.org
RUN npm install
RUN npm install pm2 -g

CMD echo $SERVER_NAME && echo $AUTHOR_NAME && npm run start && npx npm2 log

ENV SERVER_NAME = 'react-demo'
ENV AUTHOR_NAME = 'foolishmax'

.dockerignore

1
2
.git
node_modules

始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作

1
docker build -t aaa:ccc .

-t: 指定要创建的目标镜像名
.:Dockerfile文件所在目录,可以指定Dockerfile的绝对路径
aaa:镜像名
ccc:镜像的标签

查看镜像分层情况

docker image history e34293

docker images 查看

1
2
3
4
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
react-demo-image latest 35c499bddac6 3 minutes ago 1.22GB
node-test latest 028a51c6e54d 8 months ago 945MB
nginx latest f1325989da19 8 months ago 134MB

运行容器

1
docker run -p 8081:3000 -d --name react-demo-server react-demo-image

查看容器

1
2
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                    NAMES
f71ef1480035 react-demo-image "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:8081->3000/tcp react-demo-server

contaier保存为镜像

docker container commit 884 hello/nginx

查看日志

docker logs f71ef1480035

1
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
# 这两行对应Dockerfile中的CMD变量打印
= react-demo
= foolishmax

> react-demo@0.1.0 start
> react-scripts start

(node:27) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:27) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
Starting the development server...

Compiled successfully!

You can now view react-demo in the browser.

Local: http://localhost:3000
On Your Network: http://172.17.0.2:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
Compiling...
Compiled successfully!
webpack compiled successfully

停止容器

// 列出所有container
docker container ps -a
// 列出所有container的id
docker container ps -aq
// 停止所有的container
docker container stop $(docker container ps -aq)
// 指定某个id停止容器
docker stop f71ef1480035

删除容器

// 删除所有的container
docker container rm $(docker container ps -aq)
// 指定某个id删除容器
docker rm f71ef1480035

删除镜像

docker rmi 35c499bddac6

1
2
Untagged: react-demo-image:latest
Deleted: sha256:35c499bddac6675ff20a7d951fc1c1f6770a10430278fec6f2b8d1c866037624

docker-compose.yml 文件

1
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3'
services:
editor-server: # service name
build:
context: . #当前目录
dockerfile: Dockerfile # 基于Dockerfile构建
image: editor-server #依赖当前dockerfile创建出来的镜像
container_name: editor-server
ports:
- 8081:3000 #宿主机通过8081访问
editor-redis:
image: redis #引用官方redis镜像
container_name: editor-redis
ports:
- 6378:6379
environment:
- TZ=Asia/Shanghai # 设置时区
editor-mysql:
image: mysql # 引用官网 mysql 镜像
container_name: editor-mysql
restart: always # 出错则重启
privileged: true # 高权限,执行下面的 mysql/init
command: --default-authentication-plugin=mysql_native_password # 远程访问
ports:
- 3305:3306 # 宿主机可以用 127.0.0.1:3305 即可连接容器中的数据库,和 redis 一样
volumes:
- .docker-volumes/mysql/log:/var/log/mysql # 记录日志
- .docker-volumes/mysql/data:/var/lib/mysql # 数据持久化
- ./mysql/init:/docker-entrypoint-initdb.d/ # 初始化 sql
environment:
- MYSQL_DATABASE=imooc_lego_course # 初始化容器时创建数据库
- MYSQL_ROOT_PASSWORD=Mysql_2019
- TZ=Asia/Shanghai # 设置时区
editor-mongo:
image: mongo # 引用官网 mongo 镜像
container_name: editor-mongo
restart: always
volumes:
- '.docker-volumes/mongo/data:/data/db' # 数据持久化,映射本地文件
environment:
- MONGO_INITDB_DATABASE=imooc_lego_course
- TZ=Asia/Shanghai # 设置时区
ports:
- '27016:27017' # 宿主机可以用 127.0.0.1:27016 即可连接容器中的数据库
  • 构建容器 docker-compose build
  • 启动所有服务器 docker-compose up -d,后台启动
  • 查看服务 docker-compose ps (相比较 docker ps 等于多了层作用域)
  • 停止所有服务 docker-compose down

注意:
经过以上操作之后需修改.gitignore 文件,增加一行 .docker-volumes/

评论