Docker学习笔记

2021/11/19 DockerNginxOracleMySQLRedisElasticSearchFastDFSNaco

docker docs (opens new window)

Docker教程 | 菜鸟教程 (opens new window)

# 安装/升级Docker客户端

# 卸载docker

# yum remove docker*
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
1
2
3
4
5
6
7
8
9

# 安装docker

# Step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

# Step 4: 开启Docker服务
sudo service docker start
# 设置开机启动
systemctl enable docker

# step 5:检查是否安装成功
docker version
docker into
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 配置镜像加速器

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://4uv4xvt5.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8
9
10

https://docs.docker.com/engine/install/centos/ (opens new window)

https://developer.aliyun.com/article/110806 (opens new window)

https://help.aliyun.com/document_detail/60750.html (opens new window)

# Docker CLI

docker docs reference (opens new window)

docker hub (opens new window)

# docker search/pull/images/rmi

# 搜索镜像
docker search [OPTIONS] TERM
# 拉取镜像
docker pull NAME[:TAG]
# 镜像列表
docker images
# 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
1
2
3
4
5
6
7
8

# docker inspect

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

docker inspect 40c68ed3a4d2
1
2
3

# docker build/tag/push

# docker build

docker build [OPTIONS] PATH | URL | -
docker build -t runoob/centos:6.7 -f Dockerfile .
1
2
Name, shorthand Default Description
--file , -f Name of the Dockerfile (Default is 'PATH/Dockerfile')
--tag , -t Name and optionally a tag in the 'name:tag' format

# docker tag

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 860c279d2fec runoob/centos:dev
1
2

# docker push

docker push [OPTIONS] NAME[:TAG]
1

# docker cp

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
1

The docker cp utility copies the contents of SRC_PATH to the DEST_PATH. You can copy from the container’s file system to the local machine or the reverse, from the local filesystem to the container.

The cp command behaves like the Unix cp -a command in that directories are copied recursively with permissions preserved if possible.

SRC_PATH specifies a file DEST_PATH does not exist the file is saved to a file created at DEST_PATH DEST_PATH exists and is a file the destination is overwritten with the source file’s contents DEST_PATH exists and is a directory the file is copied into this directory using the basename from SRC_PATH SRC_PATH specifies a directory DEST_PATH does not exist DEST_PATH is created as a directory and the contents of the source directory are copied into this directory

# docker network

docker network COMMAND

# 为已运行容器移除网络
docker network disconnect my-network 5d61a524ddd0
# 移除网络
docker network rm my-network
# 创建网络
docker network create -d bridge testnet
# 为已运行容器添加网络
docker network connect --alias testnet-mysql testnet 5d61a524ddd0
docker network connect --alias testnet-nacos testnet 919589ca7fd1
1
2
3
4
5
6
7
8
9
10
11
Command Description
docker network create (opens new window) Create a network
docker network create [OPTIONS] NETWORK
docker network rm (opens new window) Remove one or more networks
docker network prune (opens new window) Remove all unused networks
docker network connect (opens new window) Connect a container to a network
docker network disconnect (opens new window) Disconnect a container from a network
docker network ls (opens new window) List networks
docker network inspect (opens new window) Display detailed information on one or more networks

# docker run

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run hello-world
docker run -i -t ubuntu:latest /bin/bash 
docker run -it ubuntu:latest /bin/bash
1
2
3
4
5
Option Description
--name 指定容器名称
-i 交互式操作
-t 分配伪终端
-e Set environment variables
-p Publish or expose port
-v The -v flag mounts the current working directory into the container.
When the host directory of a bind-mounted volume doesn’t exist,
Docker will automatically create this directory on the host for you.
In the example above,
Docker will create the /doesnt/exist folder before starting your container.
--network (opens new window) Connect a container to a network
--network-alias Add network-scoped alias for the container

# docker exec

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
1
Name, shorthand Description
--interactive , -i Keep STDIN open even if not attached
--tty , -t Allocate a pseudo-TTY

# docker ps/start/stop/rm/logs

# 列出正在运行的容器
docker ps
# 列出全部容器
docker ps -a

# 重启容器
docker start container_id
# 停止容器
docker stop container_id

# 删除容器
docker rm container_id
# 强制删除容器
docker rm -f container_id

# 查看容器日志
docker logs container_id/container_name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# docker container update

docker container update --restart=always container_id/container_name
1

# Dockerfile

Dockerfile (opens new window) 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

# 指定基础镜像
FROM image[:tag]

# 为镜像添加元数据
LABEL <key>=<value> <key>=<value> <key>=<value> ...

# 设置环境变量,在后续指令中可通过 $key 引用
ENV key=value [key2=value2 ...]
# 与 ENV 作用一致,但作用域不同
ARG key=value

# 暴露端口号
EXPOSE <port> [<port>/<protocol>...]

# 卷挂载
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db

# WORKDIR 指令为 Dockerfile 中跟随它的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。WORKDIR 指令可以在 Dockerfile 中多次使用。 如果提供了相对路径,它将相对于前一个 WORKDIR 指令的路径。
WORKDIR /path/to/workdir

# 从上下文目录中复制文件或者目录到容器里指定路径,目标路径不存在的话,会自动创建
COPY src dest
# 与 COPY 类似,同样需求下,官方推荐使用 COPY
ADD src dest

# shell 格式
# 在Linux上等同于:/bin/sh -c command
# 在Windows上等同于:cmd /S /C command
RUN command

# exec 格式, 官方推荐
CMD ["executable","param1","param2"]
# 为 ENTRYPOINT 设置默认值
CMD ["param1","param2"]

ENTRYPOINT ["executable", "param1", "param2"]
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

# RUN、CMD和ENTRYPOINT异同点

相同点:

  • 三者都是用于运行程序。

不同点:

  • 执行时机不同。RUN是在 docker build 时执行的,CMD和ENTRYPOINT是在 docker run 时执行的。
  • 指令个数不同。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

# COPY和ADD

# ENV和ARG

ENV 设置的环境变量会存在于生成的镜像中,可以使用 docker run --env key=value 更改它们,可以使用 docker inspect 查看它们。

ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,可以用 --build-arg <参数名>=<值> 来覆盖。

# Docker Compose

Compose (opens new window) 用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

这里 (opens new window)下载 Docker Compose 文件,放在 /usr/local/bin 目录下

# 重命名
mv docker-compose-linux-x86_64 docker-compose
# 添加可执行权限
chmod +x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose --version
1
2
3
4
5
6

# 编写 docker-compose.yml

# 运行应用

docker-compose up
# 后台启动
docker-compose up -d
# 指定配置文件 + 后台启动
docker-compose -f /path/to/docker-compose.yml up -d
1
2
3
4
5

Docker Compose | 菜鸟教程 (opens new window)

# Docker 安装 Nginx

# 拉取镜像
docker pull nginx

# 运行容器
docker run --name my-nginx \
-p 8080:80 \
-d nginx

# 拷贝文件
docker cp a7a715f67e1e:/etc/nginx/nginx.conf /my/nginx/nginx.conf
docker cp a7a715f67e1e:/usr/share/nginx/html /my/nginx

# 运行容器
docker run --name my-nginx \
-v /my/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /my/nginx/html:/usr/share/nginx/html:ro \
-p 8080:80 \
-d nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# Docker 安装 Oracle

https://www.cnblogs.com/xiaoyuxixi/p/13739596.html (opens new window)

https://github.com/oracle/docker-images (opens new window)

# Docker 安装 MySQL

# 拉取镜像
docker pull mysql

# 运行容器
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123 \ 
--network testnet \
--network-alias testnet-mysql \
-d mysql

# 创建目录
mkdir -p /my/mysql
cd /my/mysql
mkdir conf
mkdir data

# 运行容器
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123 \
--network testnet \
--network-alias testnet-mysql \
-v /my/mysql/conf:/etc/mysql/conf.d \
-v /my/mysql/data:/var/lib/mysql \
-p 3306:3306 \
-p 33060:33060 \
--restart=always \
-d mysql

# 进入容器
docker exec -it my-mysql bash
mysql -h 127.0.0.1 -u root -p
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

# Docker 安装 Redis

# 拉取镜像
docker pull redis:6.2.6

# 运行容器
docker run --name my-redis \
--network testnet \
--network-alias testnet-redis \
-p 6379:6379 \
-d redis:6.2.6 \
redis-server \
--save 60 1 \
--restart=always \
--loglevel warning

# 进入容器
docker exec -it my-redis redis-cli -h testnet-nacos -p 6379
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Docker 安装 ElasticSearch

# 拉取镜像
docker pull elasticsearch:6.8.20

# 运行容器
docker run -d \
--name my-es \
--net testnet \
--net-alias testnet-es \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:6.8.20
1
2
3
4
5
6
7
8
9
10
11
12

# Docker 安装 FastDFS

https://registry.hub.docker.com/r/season/fastdfs (opens new window)

# Docker 安装 Naco

https://nacos.io/zh-cn/docs/quick-start-docker.html (opens new window)

修改 example/standalone-mysql-8.yaml up

version: "2"
services:
  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: my-nacos
    env_file:
      - ../env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
      - "9555:9555"
    restart: always
    networks:
      testnet:
        aliases:
         - testnet-nacos    
networks:
  default:
    external:
      name: testnet
  testnet:
    external: true
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

修改 env/nacos-standlone-mysql.env

PREFER_HOST_MODE=testnet-nacos
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=testnet-mysql
MYSQL_SERVICE_DB_NAME=ry-config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
1
2
3
4
5
6
7
8
9
cd /my/nacos/nacos-docker
# 启动容器
docker-compose -f example/standalone-mysql-8.yaml up -d

# 实时输出日志
docker logs -f dffd8a78274c
1
2
3
4
5
6

# 云部署

登录阿里云 Docker Registry

docker login --username=maiam妹 registry.cn-shenzhen.aliyuncs.com
# docker login --username=maiam妹 registry-vpc.cn-shenzhen.aliyuncs.com
1
2

# 个人博客

Dockerfile

FROM nginx:1.20
COPY html /usr/share/nginx/html
1
2
unzip maiaimei.gitxx.io.zip -d html

docker rmi blog:1.0-SNAPSHOT
docker rmi registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT

docker build -t blog:1.0-SNAPSHOT -f Dockerfile .

docker tag blog:1.0-SNAPSHOT registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT

docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT

docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT

docker run --name blog -p 80:80 -d blog:1.0-SNAPSHOT
docker run --name blog -p 80:80 -d registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 若依微服务

# 构建镜像

docker build -t ruoyi-system:3.2.0 -f Dockerfile .
docker build -t ruoyi-file:3.2.0 -f Dockerfile .
docker build -t ruoyi-job:3.2.0 -f Dockerfile .
docker build -t ruoyi-auth:3.2.0 -f Dockerfile .
docker build -t ruoyi-gateway:3.2.0 -f Dockerfile .
docker build -t ruoyi-ui:3.2.0 -f Dockerfile .
1
2
3
4
5
6

# 打标签

docker tag ea7307d2615f registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0
docker tag 62bcb37e91e8 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0
docker tag 32fdb2de69b5 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0
docker tag 6caf13e8369d registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-auth:3.2.0
docker tag c9c352c6b90a registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0
docker tag 3ca7aa53ca76 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0
1
2
3
4
5
6

# 推送镜像

docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0
docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0
docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0
docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-auth:3.2.0
docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0
docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0
1
2
3
4
5
6

# 拉取镜像

docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0
docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0
docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0
docker pull registry.cn-shenzhen.aliyuncs.comm/maiaimei/ruoyi-auth:3.2.0
docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0
docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0
1
2
3
4
5
6

# 运行容器

docker run \
--name ruoyi-system \
-e JAVA_PARAMS="-Dserver.port=9201 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test" \
-p 9201:9201 \
-d \
ruoyi-system:3.2.0

docker run \
--name ruoyi-file \
-e JAVA_PARAMS="-Dserver.port=9300 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test" \
-p 9300:9300 \
-d \
ruoyi-file:3.2.0

docker run \
--name ruoyi-job \
-e JAVA_PARAMS="-Dserver.port=9203 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test" \
-p 9203:9203 \
-d \
ruoyi-job:3.2.0

docker run \
--name ruoyi-auth \
-e JAVA_PARAMS="-Dserver.port=9200 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test" \
-p 9200:9200 \
-d \
ruoyi-auth:3.2.0

# 服务网关
docker run \
--name ruoyi-gateway \
-e JAVA_PARAMS="-Dserver.port=8080 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test" \
-p 8080:8080 \
-d \
ruoyi-gateway:3.2.0

docker run --name ruoyi-ui \
-p 80:80 \
-d ruoyi-ui:3.2.0
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