docker基础入门

以下内容基于centOS-7,镜像传送门:https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso

一、docker安装

1.1 卸载旧版

  尝试卸载旧版,如果存在就卸载,不存在也没有影响,命令如下:

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

1.2 配置docker的yum库

  首先安装yum工具,这里安装了三个包,其中-y代表安装中所有询问都默认为‘yes’

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

  配置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
  • sed是一个流编辑器;
  • -i 表示就地修改;
  • /etc/yum.repos.d/docker-ce.repo代表要修改的文件名路径
  • s+download.docker.com+mirrors.aliyun.com/docker-ce+:s是sed的替换指令,+起到分割的作用

  更新yum,建立缓存

1
sudo yum makecache fast

1.3 安装docker

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

1.4 启动和校验

1
2
3
4
5
6
7
8
#启动docker
systemctl start docker

#设置开机自启动
systemctl enable docker

# 不报错,说明docker启动成功
docker ps

1.5 docker镜像加速器

  24年6月国内大部分的docker镜像加速器都被关闭,包括阿里云的服务,不过好在华为云的还可以使用。搜索华为云的“容器镜像服务”,获得自己的镜像加速网址,随后使用如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建目录
mkdir -p /etc/docker

# 加速地址改成自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://xxx.mirror.swr.myhuaweicloud.com"
]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

二、docker架构

  开启docker的服务后,在docker Server中会有一个守护进程dicker daemon时刻监听Client端发出的命令。
  在docker内存在本地镜像仓库images和容器container,本地镜像仓库保存从外部镜像仓库下载的镜像(所谓镜像,就是一个包含运行环境和已经解压好的软件安装包内容)。container则是对于对于镜像的运行实例,每当使用run命令就会开启一个新的container实例,一个image可以同时有多个container实例来实现集群效果。
  在docker中,每一个container其实是一个小型的虚拟机,每一个container都有完整的linux文件系统、网络系统等

三、docker常见命令

1
2
3
4
5
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
  • docker run:创建并运行一个容器;
    • -d:表示容器在后台运行;
    • --name:容器的名字,必须唯一;
    • -p xxx:yyy:端口映射,xxx是运行docker机器的端口,yyy是容器虚拟机的端口;
    • -e:环境配置,不同的软件部署有不同的环境配置;
    • mysql:全称是Repository:TAG,前面是镜像名称,后面是相应的版本号,忽略版本号则默认下载最新的。
  • docker pull nginx:从远程仓库下载镜像nginx
  • docker images:查看本地所有镜像
  • docker save [-o nginx.tar] nginx:latest:保存镜像到本地
    • -o:保存文件的名称
  • docker load -i nginx.tar:上传本地文件到docker
  • docker ps [--format ···]:查看所有已经运行的容器
    • --format:格式化输出
  • docker ps -a:查看所有容器
  • docker stop nginx:停止nginx服务,但是nginx的container还存在
  • docker start nginx:开启nginx服务,但是不创建容器,容器已经存在
  • docker logs [-f] nginx:查看日志,-f是持续查看日志,会阻塞当前进程
  • docker exec -it nginx bash:以bash命令行模式进入nginx服务虚拟机
  • docker rm nginx [-f]:删除nginx的container,image还存在
    • -f:强制删除服务未停止的容器
  • docker rmi nginx:删除镜像

命令别名
通过修改~/.bashrc文件,可实现命令别名
alias dockerfmt='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'

四、资源挂载

  由于镜像内环境是一个程序运行的最小环境,所以不含有类似于vi等命令,因此直接对容器内的文件数据等资源进行修改或添加比较困难,故需要用到挂载。
  挂载使得宿主机的某一文件或文件夹与容器内的文件或文件夹产生双向关联,此时就可以通过操作宿主机的文件来修改容器内的文件。

4.1 数据卷挂载

  1. 数据卷:是一个虚拟目录,使容器内目录与宿主机目录之间映射的桥梁。数据卷宿主机目录固定为/var/lib/docker/volumes
  1. 数据卷相关命令
  • 只有在使用docker run是才可以进行挂载
  • 挂载时,若数据卷不存在,则会自动创建数据卷

挂载命令

1
2
3
4
5
docker run -d \
--name nginx \
-p 80:80 \
-v html:/usr/share/nginx/html \
nginx

4.2 本地目录挂载

  数据卷挂载的宿主机目录是固定的,而本地目录挂载可以实现在宿主机的任意目录下进行挂载,增加了灵活性。

挂载命令

-v 本地目录:容器内目录:注意本地目录需要以/或者./开头,否则会被认为是数据卷挂载

五、构建镜像

5.1 自定义镜像

定义
  镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程就是把上述文件打包的过程。

镜像结构

  • 一个镜像可能包含多个镜像的压缩包,例如环境压缩包、程序压缩包等。例如一个centOS-7环境的镜像可能会被很多其他镜像作为环境使用,这样就形成了镜像的结构。
  • 基础镜像:应用依赖的系统库函数、环境、配置等
  • 入口:镜像的运行入口,一般是程序的脚本和参数

5.2 Dockerfile

  Dockerfile是一个包含指令的文本文件,Docker可以根据编写的Dockerfile自动构建镜像。Dockerfile的常见指令如下:

一个简单的Dockerfile例子

1
2
3
4
5
6
# 基础镜像
FROM openjdk:11.0-jre-buster
#拷贝jar包到镜像
COPY docker-demo.jar /app.jar
#镜像入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

5.3 构建镜像

  前面的Dockerfile相当于构建镜像的自动化脚本,此时还需要通过docker运行这个脚本就可以成功构建镜像,镜像的构建命令:

1
docker build -t 镜像名:版本号 .
  • 说明:最后的‘.’表示Dockerfile所在的目录,‘.’表示在当前目录下

5.4 项目部署

  当部署一个项目时,可能会有前端、后端、各种中间件,这时如果分别进行部署可能会导致遗漏。因此提出了DockerCompose,对一个完整的项目,只需编写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.8"

services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall

docker-compose常见命令

六、容器网络

6.1 默认配置

  在默认情况下,当启动docker服务时会自动创建一个默认的虚拟网卡docker0,所有启动的容器会默认的通过网桥连接到默认的虚拟网卡。

6.2 自定义网络

  可以通过create创建网络,随后通过connect将某些容器加入到网络,或者可以在docker run指令中添加--network来初始化网络,如果网络进行初始化,那么该容器将不会连接到默认的网卡上

自定义网络的优势

  在默认的网络下,容器之间之可以通过IP来互相访问,而容器的IP地址会发生变化,这样可能会导致容器之间无法找到对方。
  在自定义的网络中,除了可以通过IP访问其他容器,还可以通过容器名进行访问,这样可以解决容器之间找不到对方的问题。