Docker学习笔记
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
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
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
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 search/pull/images/rmi
# 搜索镜像
docker search [OPTIONS] TERM
# 拉取镜像
docker pull NAME[:TAG]
# 镜像列表
docker images
# 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
2
3
4
5
6
7
8
# docker inspect
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect 40c68ed3a4d2
2
3
# docker build/tag/push
# docker build
docker build [OPTIONS] PATH | URL | -
docker build -t runoob/centos:6.7 -f Dockerfile .
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
2
# docker push
docker push [OPTIONS] NAME[:TAG]
# docker cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
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
2
3
4
5
6
7
8
9
10
11
Command | Description |
---|---|
docker network create (opens new window) | Create a networkdocker 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
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...]
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
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
# 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"]
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
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
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
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
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
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
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
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
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
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
2
# 个人博客
Dockerfile
FROM nginx:1.20
COPY html /usr/share/nginx/html
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
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 .
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
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
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
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
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