Docker

初识 Docker

快速构建、运行、管理应用的工具。

Docker 卸载

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

Docker 安装

1、安装yum工具

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2、配置Docker的yum源

1
2
3
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

3、更新yum,建立缓存

1
sudo yum makecache fast

4、安装Docker

1
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5、启动与校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

Docker 基本概念

应用镜像image:包含应用本身及运行时需要的环境、配置、系统函数库等的快照。

容器Container:Docker通过image创建应用实例时所创建的隔离环境。

镜像名称: repository:tag, tag为镜像版本。

Docker 常见命令

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
# 镜像拉取
docker pull
# 镜像推送
docker push

# 查询系统所有镜像
docker images
# 移除镜像
docker rmi
# 从dockefile构建镜像
docker build
# 镜像保存为压缩包
docker save
# 从压缩包加载镜像
docker load

# 运行镜像
docker run

# 容器日志
docker logs
# 容器执行
docker exec
# 查询系统所有容器
docker ps
# 移除容器
docker rm
# 容器挂起
docker stop
# 容器继续
docker start

# 创建数据卷
docker volume create
# 查询所有数据卷
docker volume ls
# 删除指定数据卷
docker volume rm
# 查看某数据卷详细信息
docker volume inspect
# 清除未使用的数据卷
docker volume prune

Docker 数据卷

数据卷(volume),是容器内目录与宿主机目录之间映射的桥梁。

有些容器在创建时会自动创建匿名数据卷,也可在创建时手动指定要挂载的目录。注意,在容器创建后,数据卷挂载就不可再修改。

Docker 容器创建

1
2
3
4
5
6
7
8
9
10
# -d 表示静默运行
docker run -d \
--name 容器名 \
-p 宿主机端口:容器端口 \
# -v 本地目录挂载,不存在时自动创建
-v 宿主机目录:容器内目录 \
# -e 设置环境变量
-e key=value \
-network 网络名 \
镜像名称

注意,本地目录必须以 / 或 ./ 开头,否则会被识别为数据卷。

自定义镜像 Dockerfile

镜像结构

入口,EntryPoint:镜像运行入口,一般为程序启动脚本和参数。

层,Layer:添加安装包、依赖、配置等,每次操作为一层。

基础镜像,BaseImage:应用依赖的系统函数库、配置、环境等。

镜像描述文件 Dockerfile

说明 示例
FROM 指定基础镜像 FROM centos:7
ENV 指定环境变量 ENV key=value
COPY 拷贝本地文件,到镜像指定位置 COPY ./jdk17.tar.gz /tmp
RUN 执行Linux命令 RUN tar -zxvf /tmp/jdk17.tar.gz
EXPOSE 指定运行时需暴露的端口 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令 ENTRYPOINT java -jar xx.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 指定centos7为基础镜像
FROM centos:7
# 安装jdk到镜像
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz
# 配置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH
# 创建应用目录
RUN mkdir -p /app
WORKDIR /app
# 部署应用到容器
COPY app.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动脚本
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

构建自定义镜像

1、编写Dockerfile文件

2、执行构建命令

1
2
3
# -t repository:tag 给镜像起名
# . 为指定dockerfile所在目录, .指代当前目录
docker build -t myimage:1.0 .

Docker 网络

Docker中所有容器,都是以bridge的方式连接到Docker中的一个虚拟网桥上。

通过让不同容器连接至同一自定义网络,可以让容器间通过容器名互相访问,以此代替ip通信。解决了ip地址经常变动及不确定的问题。

网络相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个网络
docker network create
# 查看所有网络
docker network ls
# 移除一个网络
docker network rm
# 清除未使用的网络
docker network prune
# 使指定容器连上指定网络
docker network connect
# 使指定容器断开指定网络
docker network disconnect
# 查看网络详细信息
docker network inspect

DockerCompose

通过 docker-compose.yml 模板文件,来定义一组相互关联的容器。可以实现多个互相关联的Docker容器的快速部署。

yml文件

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
# 服务列表
services:
# mysql服务
mysql:
image: mysql:8
container_name: mysql
ports:
- "3307:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "宿主机目录:容器目录"
networks:
- tlias-net
# 自定义镜像的服务
tlias:
build:
context: .
dockerfile: Dockerfile
container_name: tlias-server
ports:
- "8080:8080"
networks:
- tlias-net
depends_on:
- mysql
# 自定义网络,与服务列表同级
networks:
tlias-net:
# 此处才是指定网络名称,tlias-net为网络组名称
name: itheima

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
docker compose [OPTIONS] [COMMAND]
# Options
-f 指定compose文件路径和名称,默认为当前目录下寻找
-p 指定project名称,默认为当前目录名称
# Commands
up 创建并启动所有Service容器
down 停止并移除所有Service容器、网络
ps 列出所有启动的容器
logs 查看指定容器日志
stop 挂起容器
start 启动容器
restart 重启容器
top 查看运行进程