容器简介

容器是操作系统级的进程虚拟化,它对进程进行封装,使其共享操作系统内核的同时相互隔离、互不影响;相较于传统虚拟机更加轻量化,性能更加优良,系统负载更低,资源利用率更高;关键作用:它能保证代码运行环境的一致性
Docker 就是目前相当成熟的一个开源的应用容器引擎,容器集群目前有 Swarm & Kubernetes;看客户实际使用的是什么,我们只需要准备镜像即可。
Docker 镜像可以简单看为一个软件包,这个软件包能提供应用程序完整的运行时环境:应用程序的代码、相关的配置文件、应用程序所需的依赖库等等。

容器部署

快捷安装

1
2
3
4
5
6
7
8
9
10
11
12
13
#修改阿里源
cat > /etc/yum.repos.d/docker-ce.repo << EOF
[docker-ce-stable]
name=Docker CE Stable
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install docker-ce-20.10.10
#官方脚本安装
curl -fsSL https://get.docker.com -o install-docker.sh && sh install-docker.sh --version 20.10.20 --mirror Aliyun

安装完成以后启动并添加自启

1
2
3
4
#设置自启动
systemctl enable docker
#启动 Docker
systemctl start 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
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"live-restore": true,
"exec-opts": [
"native.cgroupdriver=systemd"
],
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
},
"log-driver": "json-file",
"log-level": "info",
"log-opts": {
"max-file": "10",
"max-size": "50m"
},
"registry-mirror": [
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.nju.edu.cn",
"https://dockerproxy.com"
],
"insecure-registries": [
"0.0.0.0/0"
],
"max-concurrent-downloads": 8,
"max-concurrent-uploads": 8,
"ipv6": false,
"experimental": true
}
EOF

systemctl daemon-reload & systemctl restart docker
docker info

镜像加速

授权用户

sudo

1
2
3
4
5
6
7
8
#sudo,需要加入 /etc/sudoers 文件
#第一列:root 即用户账号
#第二列:ALL 指登陆者来源主机;括号中的 ALL 指目标用户,即以谁的身份去执行命令
#第三列:ALL 指命令名,想免除密码输入加上 NOPASSWD:ALL
chmod 640 /etc/sudoers
echo "app ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
cat /etc/sudoers
chmod 440 /etc/sudoers

加入群组

Docker 安装之后默认会创建 docker 组,它拥有读取套接字权限,因此将该普通用户加入 docker 组就有访问 unix 套接字的权限,然后刷新用户的初始组即可。

1
2
3
4
5
6
7
8
9
10
#查询 docker 组是否创建,不存在需要手动创建
cat /etc/group | grep docker
groupadd docker
#查询套接字是否是 docker 组,不是需要修改
ll /var/run/docker.sock
chgrp docker /var/run/docker.sock
#将用户加入 docker 组,然后刷新用户组
gpasswd -a xxx docker
#使用该命令更新用户组
newgrp 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
#查看运行中的容器
docker ps
#查看所有容器,包括停止的
docker ps -a
#查看安裝的镜像
docker images
#正常停止容器
docker stop <容器名称/ID>
#启动已有容器
docker start <容器名称/ID>
#强制停止容器
docker kill <容器名称/ID>
#进入容器,运行脚本
docker exec -it <容器名称/ID> /bin/bash
#查看容器日志
docker logs <容器名称/ID> -f
#删除指定 ID 的容器
docker rm <容器名称/ID>
#删除指定 ID 的镜像
docker rmi <镜像名称/ID>
#查看 Volume 列表
docker volume ls
#查看网络列表
docker network ls

容器镜像

拉取镜像

1
2
3
4
5
6
7
#从镜像仓库中拉取或者更新指定镜像
docker pull
docker pull nginx:latest
docker pull nginx:1.22.1
docker pull mysql:8.0.21
#查看安裝的镜像
docker images

no matching manifest for liunx/arm64 in the manifest list entries:

构建镜像

构建自己的镜像有两种方法:

  • 使用 docker commit 命令
  • 使用 Dockerfile 文件 & docker build 命令

    Dockerfile

    在项目目录创建 Dockerfile 文件:vi Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FROM centos_v7.9-zh_cn-jdk8:220915001
    MAINTAINER Jun Yu<work@yuwei.cc>
    RUN useradd -r -u 1000 -g appuser
    USER appuser
    RUN mkdir -p /app/data
    ADD xxx.tar.gz /app/
    RUN chmod 755 /app
    EXPOSE 8088
    RUN ln -sf /dev/stdout /app/logs/stdout.log
    #ENTRYPOINT java -jar /app/app.jar > /app/logs/stdout.log 2>&1
    CMD ["/bin/bash","-c","/app/bin/resatrt.sh && -f /app/logs/stdout.log"]

    保存文件,执行命令进行构建

    1
    2
    docker build -t demo/test:v1 .
    docker build -f Dockerfile_Demo -t demo/test:v1 .

    查看构建镜像

    1
    2
    docker history demo/test:v1
    docker inspect demo/test:v1

    可持久化

    Docker 的镜像是只读的,容器是可写的;但是将数据写入到容器,一旦容器删除数据也将丢失,所以就需要将容器数据进行持久化存储

    bind mount

    将宿主机目录直接映射到容器,适合挂载依赖环境,如:Node、Java 等,可挂到多个容器上

    1
    2
    mkdir /opt/node
    docker run -itd --name Demo1 -v /opt/node:/node centos

    volume

    volume 由 Docker 来管理(创建、删除),创建在宿主机,存储空间来自于宿主机文件系统中的某个目录;所以删除容器不会丢失,官方推荐,适合存储数据,如 MySQL 数据,可挂到多个容器上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #创建 volume
    docker volume create V_JDK
    #查看卷的参数信息
    docker inspect V_JDK
    #运行容器并挂载 volume
    docker run -itd --name Demo2 -v V_JDK centos
    #查看容器卷信息
    docker inspect <容器名称/ID> | grep -i volume
    #查看Docker数据卷
    docker volume ls
    #删除不用的数据卷
    docker volume prune
    #删除一个或多个数据卷
    docker volume rm xxx

    tmpfs mount

    tmpfs 是将文件写到存宿主机内存中,避免增加容器大小,适合存储临时文件,不可多容器共享

    1
    docker run -itd --name Demo3 --tmpfs /demo centos

    数据共享

    容器单独

    1
    2
    --volumes-from
    docker run -itd --name Demo4 --volumes-from Demo1 --volumes-from Demo2 centos

    使用 NFS

    1
    2
    3
    4
    5
    docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.254.100,rw \
    --opt device=:/mnt/nfs \
    V_NFS

    容器网络

    安装完 Docker 系统会自动添加一个供 Docker 使用的网桥docker0,共五种模式:

  • bridge:默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈

  • host:这个模式下创建出来的容器,直接使用容器宿主机的网络命名空间,即使用宿主机的 IP 和端口
  • none:为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有 lo
  • container:指定一个已有的容器,共享该容器的 IP 和端口;—net=container:<容器名称/ID>
  • 自定义:使用第三方的网络实现或者创建单独的 bridge 网络,提供网络隔离能力
    1
    2
    3
    docker network create N_Demo
    docker run -itd --name MyDB --network N_Demo --network-alias mysql mysql:latest
    #使用相同网络的其他容器可以使用网络别名进行访问

    容器编排

    Docker-Compose 是一个容器编排工具,通过编辑 yaml 文件将所有的容器的部署方法、文件映射、容器端口映射等情况进行提前设置,然后执行 docker-compose up 命令进行快速部署。