Docker 不完全食用指北
容器简介
容器是操作系统级的进程虚拟化,它对进程进行封装,使其共享操作系统内核的同时相互隔离、互不影响;相较于传统虚拟机更加轻量化,性能更加优良,系统负载更低,资源利用率更高;关键作用:它能保证代码运行环境的一致性。
Docker 就是目前相当成熟的一个开源的应用容器引擎,容器集群目前有 Swarm & Kubernetes;看客户实际使用的是什么,我们只需要准备镜像即可。
Docker 镜像可以简单看为一个软件包,这个软件包能提供应用程序完整的运行时环境:应用程序的代码、相关的配置文件、应用程序所需的依赖库等等。
容器部署
快捷安装
1 | #修改阿里源 |
安装完成以后启动并添加自启1
2
3
4#设置自启动
systemctl enable docker
#启动 Docker
systemctl start docker
修改配置
1 | mkdir /etc/docker |
镜像加速
授权用户
sudo
1 | #sudo,需要加入 /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 | #从镜像仓库中拉取或者更新指定镜像 |
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
11FROM 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
2docker build -t demo/test:v1 .
docker build -f Dockerfile_Demo -t demo/test:v1 .查看构建镜像
1
2docker history demo/test:v1
docker inspect demo/test:v1可持久化
Docker 的镜像是只读的,容器是可写的;但是将数据写入到容器,一旦容器删除数据也将丢失,所以就需要将容器数据进行持久化存储
bind mount
将宿主机目录直接映射到容器,适合挂载依赖环境,如:Node、Java 等,可挂到多个容器上
1
2mkdir /opt/node
docker run -itd --name Demo1 -v /opt/node:/node centosvolume
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 xxxtmpfs 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
5docker 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
3docker network create N_Demo
docker run -itd --name MyDB --network N_Demo --network-alias mysql mysql:latest
#使用相同网络的其他容器可以使用网络别名进行访问容器编排
Docker-Compose 是一个容器编排工具,通过编辑 yaml 文件将所有的容器的部署方法、文件映射、容器端口映射等情况进行提前设置,然后执行 docker-compose up 命令进行快速部署。