Docker核心概念与使用
核心概念
什么是Docker
Docker(Moby)诞生于2013年,是一款基于 Linux LXC 容器化技术的开源的容器引擎。需要注意的是,2013版原始的开源版本 “Docker” 现在其实不叫 “Docker” 了,而是 “Moby”。这一改变发生在 2017 年的 Docker Con 大会上,因此我们现在常说的 “Docker” 实际上代表的是 Docker 公司,现在市面上所能看到的 Docker 版本通常为 Docker EE(企业版)和 Docker CE(社区版),也就是收费版和免费版本的区别,而现在的 Docker CE 实际上就可以理解为 “Moby”。
Docker拥有标准化与隔离性,就意味着我们可以轻松的为需要部署的应用构建一套独立的运行环境,且可以在任意支持容器运行的环境中快速部署我们的应用,提高应用的交付能力。
Docker与虚拟机
容器是应用程序的抽象,将应用程序代码与环境打包在一起构建一套独立的运行环境,多个容器可以在一台计算机上运行并且与其他容器共享OS内核。且每个容器之间利用用户空间来进行资源隔离,相对于操作系统来说是非常轻量的。
而虚拟机则完全是对于一台计算机的抽象,一个操作系统上可以运行多个虚拟机,但每个虚拟机都是一个独立运行的操作系统,且有着完整的一套基于硬件设备的虚拟设备进行资源的隔离,这样的抽象方式导致虚拟机无论是在运行时的资源损耗还是启动的效率都是非常重量级的操作。
Docker的结构
Docker是C/S架构,分为客户端和服务端,在安装时会默认全部安装。客户端负责向服务端发起操作请求,服务端接受请求响应处理结果。Docker服务端主要包含了容器引擎和镜像管理两部分,其中镜像管理可以连接镜像仓库和管理本地镜像,容器引擎负责执行任务,运行镜像的实例容器。
Docker操作
安装Docker
CentOS7(使用 yum 进行安装)
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# PS:如果出现如下错误信息
Loaded plugins: fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
Could not fetch/save url https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14] curl#60 - "Peer's Certificate issuer is not recognized."
# 编辑 /etc/yum.conf 文件, 在 [main] 下面添加 sslverify=0 参数
vi /etc/yum.conf
# 配置如下----------------------
[main]
sslverify=0
# -----------------------------
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo systemctl start docker
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
Ubuntu 14.04/16.04(使用 apt-get 进行安装)
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
安装校验
[root@iZ2ze18rmx2avoq1z744lcZ ~]# docker version
Client: Docker Engine - Community
Version: 26.1.4
API version: 1.45
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.33
GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker加速
Docker 默认下载镜像的仓库是在国外的, 可以配置国内一些大公司与学校搭建了一些国内的镜像仓库来加速,但近期国内的镜像也逐渐被封禁,具体的解决方案还要再观察等待。
CentOS 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["此处修改成你自己的加速 url"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
windows 配置镜像加速
在设置中添加配置
"registry-mirrors": [
"此处修改成你自己的加速 url"
]
镜像操作
操作 | 命令 | 参数说明 |
---|---|---|
查找镜像 | docker search 镜像名称 | |
拉取镜像 | docker pull 镜像名称:标签(版本号) | |
查看本地镜像 | docker images | |
删除镜像 | docker rmi 镜像名称:版本号 | -f :强制删除 |
容器操作
操作 | 命令 | 参数说明 |
---|---|---|
创建并运行一个容器 | docker run 参数… 镜像名称 | -p(小写)主机端口:容器端口:将主机端口映射到容器中的某端口, -P(大写):暴露容器中的所有端口到主机的随机端口 --name 容器名称:指定容器名称 --rm:当容器关闭时自动删除 --restart 策略:no(默认)表示不重启;on-failure,当失败时重启,还可以加上 :3 指定最多重启3次,如果3次都失败就不再重启了;always,只要已关闭就自动重启 -e 环境变量 或 --env 环境变量:环境变量使用 name=value 的方式,可以配置多个,使用逗号分割 |
查看容器 | docker ps 参数… | -a:查看所有容器,包括停止的 |
删除容器 | docker rm 参数… 容器id或名称 | -f :强制删除 |
停止容器 | docker stop 容器id或名称 | |
启动容器 | docker start 容器id或名称 | |
查看容器日志 | docker logs 参数… 容器id或名称 | -f:实时显示 -t:显示日志生成时的时间戳(默认中时区) --tail:显示最后的条数 -since:从指定时间戳开始(默认中时区,即在北京东八区的时间戳上减去8小时) |
在容器中执行指令(进入容器内部) | docker exec 参数… 容器id或名称 进入后执行的命令 | -t:分配一个虚拟的终端 -i :把交互界面保留 |
仅列举了这段时间常用的指令参数,所有指令均可以通过 --help 参数来查看指令说明和参数说明
数据卷 Volume
基本概念
数据卷相当于是容器的虚拟文件系统和主机的真实文件系统之间的一个桥梁,建立数据卷就相当于是打通了容器于主机之间的文件交互通道,可以让容器运行时所产生的数据变更被保存到主机中,能够更方便的对数据进行备份以及保护。
当我们在容器中运行一些关键的应用如MySQL、Redis等服务,其中都会存储着一些关键数据,这些数据是你希望即使删除容器也不应该被删除的,此时我们便需要用到数据卷了。
可以将数据卷理解为文件目录的映射,我们可以通过 Docker 提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。
绑定方式
匿名绑定
在启动容器时直接使用 -v /container_dir 即可完成匿名绑定,匿名绑定的方式将在 Docker 的 volumes 目录下生成一个 sha256 的字符串作为目录名,且指定的 /container_dir 中的文件或目录会被保存在该处,匿名绑定的 volume 在容器被删除的时候,数据卷也会被删除。
docker run --rm -d -p 80:80 -v 容器目录 镜像名称或ID
匿名绑定方式由于不知道名称,因此如果需要查看数据卷在主机的哪个位置,需要使用 docker inspect container_id 来查看。
具名绑定
同样是启动容器时绑定一个数据卷,不同的是可以为该数据卷起个名字 -v volume-name:container_dir,通过名字你可以快速的定位并管理这些 volume
docker run --rm -d -p 80:80 -v 数据卷名称:容器目录 镜像名称或ID
Bind Mount
绑定并加载主机的某个文件目录到容器中,这种方式是平常最常用的。这种绑定方式与前面两种一样,也是在容器启动时使用 -v host_dir:container_dir 的格式来完成映射
docker run --rm -d -p 80:80 -v 宿主机目录1:容器目录1 -v 宿主机目录2:容器目录2 镜像名称或ID
网络 Network
基本概念
Network是 Docker 对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。
网络模式
bridge
容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,在主机中创建一个 Docker0 的虚拟网桥,在 Ddocker0 创建一对虚拟网卡,有一半在主机上 vethxxx,还有一半在容器内 eth0,是默认模式。
bridge模式下,同一网段的主机,是不能直接访问宿主机内部容器的,必须通过端口映射。
host
容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间。
Host模式下,其他同一网段的虚拟主机可以直接访问宿主机内部的容器,给人的感觉就是:“宿主机就是容器,容器就是宿主机”。然而除了网络资源,容器之间的其他资源依然是相互隔离的。
Host模式在docker run的时候,添加参数–net=host来指定
none
Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息。特点是完全隔离,与外部任何机器都无网络访问,只有自己的 lo 本地网络 127.0.0.1。
none模式在docker run的时候,添加参数–net=none来指定
container
容器不创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等
container模式,通过–net=container后面直接跟冒号,冒号后面是它所依靠的指定容器,例如:–net=container:nginx_Num1
自定义
不用 Docker 自带的网络模式,而是自己去定制化自己特有的网络模式,通过docker netwok命令。
以下为创建自定义网络的例子:
docker network create -driver birdge --subnet 192.168.31.0/24 --gateway 192.168.31.1 testnet
自定义网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。
默认是不能通过hostname来进行访问的,也可以通过 --link 容器名或ID的方式来实现,其原理是在容器内部的hosts文件注册对应容器的IP
两个使用不同网络的容器进行跨网络通信,需要将两个不同网络之间建立连接,通过以下命令:
docker network connect net1 net2
Dockerfile
基本概念
Docker 为我们提供的一个用于自定义构建镜像的一个配置文件Dockerfile,用于描述如何构建一个对象,利用 Docker 提供的 build 命令,指定 Dockerfile 文件,就可以按照配置的内容将镜像构建出来。
常用指令
指令 | 说明 |
---|---|
FROM | 指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像。 如果不想以任何镜像作为基础:FROM scratch 语法: FROM image FROM image:tag FROM image:version 以上为三种写法,后两者为指定具体版本,第一种则使用 latest 也就是最新版 |
MAINTAINER | 指定该镜像的作者 语法: MAINTAINER name |
LABEL | 为镜像设置标签,一个 Dockerfile 中可以配置多个 LABEL 语法: LABEL key=value 如: LABEL “example.label”="Example Label" LABEL label-value="LABEL"br<>LABEL version="1.0.0" LABEL description=“可以写成多行,使用 \符号可以拼接多行的 value” |
ENV | 设置容器的环境变量,可以设置多个 语法: ENV key value ENV key=value key=value … 两种语法的区别为第一种一次只能设置一个环境变量,第二种可以一次设置多个 |
RUN | 构建镜像的过程中要执行的命令 语法: RUN command RUN [“executable”, “param1”, “param2”] 第一种写法就是直接写 Shell 脚本即可 第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数 |
ADD | 复制命令,把 src 的文件复制到镜像的 dest 位置,可以自动解压缩 语法: ADD src dest ADD [“src”, “dest”] |
WORKDIR | 设置工作目录,可以简单理解为 cd 到指定目录,如果该目录不存在会自动创建,对 RUN、CMD、ENTRYPOINT、COPY、ADD 生效,可以设置多次 WORKDIR 语法: WORKDIR dir 表示在容器内创建了 dir 目录,并且当前目录已经是 dir 目录了 |
VOLUME | 设置挂载目录,可以将主机中的指定目录挂载到容器中 语法: VOLUME [“dir”] VOLUME dir VOLUME dir dir |
EXPOSE | 改镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器想要暴露某些端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用 -p 或 -P 参数来映射,可以暴露多个端口 语法: EXPOSE port[/tcp/udp] |
CMD | 该镜像启动容器时默认执行的命令或参数 语法: CMD [“executable”, “param1”, “param2”] CMD [“param1”, “param2”] CMD command param1 param2 以上为该命令的三种写法,第三种与普通 Shell 命令类似,第一、二两种都是可执行文件 + 参数的形式,另外数组内的参数必须使用双引号。 案例: 第一种:CMD [“sh”, “-c”, “echo $HOME”] 等同于 sh -c "echo $ HOME" 第二种:CMD [“echo”, “$HOME”] 等同于 echo $HOME |
ENTRYPOINT | 运行容器时的启动命令,感觉与 CMD 命令会很像,实际上还是有很大区别,简单对比一下: 相同点: 在整个 Dockerfile 中只能设置一次,如果写了多次则只有最后一次生效 不同点: ENTRYPOINT 不会被运行容器时指定的命令所覆盖,而 CMD 会被覆盖 语法: ENTRYPOINT [“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2 |
ARG | 设置变量,在镜像中定义一个变量,当使用 docker build 命令构建镜像时,带上 --build-arg name=value 来指定参数值,如果该变量名在 Dockerfile 中不存在则会抛出一个警告 语法: ARG name[=default value] |
COPY | COPY 指令从 src 复制新文件、目录或远程文件 URL,并将它们添加到路径 dest 语法 COPY src dest |
仓库 Registry
基本概念
镜像仓库是用于管理 Docker 的镜像,当应用开发完成后,直接打包为一个镜像,将镜像上传到仓库后,可以在任何装有 Docker 的机器上下载该镜像,并运行为一个容器。
常用仓库
- Docker Hub:https://hub.docker.com,目前已被封禁
- 阿里云:在容器镜像服务ACR中,个人用户可免费创建3个命名空间、300个仓库,其中每个仓库只能上传一个镜像
- 自主搭建(私服仓库):常用的私服仓库有Nexus和Harbor
Nexus搭建过程:
# 创建持久化目录
mkdir -p /opt/docker/nexus
# 开放权限
chmod 777 -R /opt/docker
# 启动 nexus 容器
docker run -d --restart=always -p 8868:8081 -p 5000:5000 -p 5001:5001 --name nexus -v /opt/docker/nexus:/nexus-data sonatype/nexus3
查看默认密码
docker exec -it nexus /nexus-data/admin.password
仓库的使用
- 配置:docker默认使用https,要适配http可以在 /etc/docker/damon.json 文件中加入 inscure-repositries: [“仓库访问地址”]
- 认证:docker login -u用户名 仓库地址
- 推送镜像到仓库:
第一步:基于镜像打标签
阿里云:
docker tag <image id> registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:版本
私服仓库:
docker tag <image id> 仓库路径/镜像名称:版本
第二步:推送
docker push <tagName>[:版本]
- 从仓库拉取镜像
登录:
docker login -u用户名 仓库地址
docker pull 仓库路径/镜像名称:版本
容器编排
基本概念
容器编排就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。
Docker Compose(单机)
有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
yaml配置文件可参考文档:https://www.bookstack.cn/read/dockerdocs/Compose-yml.md
以下为一个简单例子:
version: "2.1"
services:
# 其中一个service配置
nginx-demo:
container_name: "nginx_compose"
image: "nginx"
restart: "always"
ports:
- 80
networks:
- my_net
environment:
APP_ENV: dev
networks:
my_net:
ipam:
driver: default
config:
- subnet: 188.18.0.0/16
gateway: 188.18.0.1
Swarm(分布式)
核心概念
Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
关键概念
- Swarm
集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit,可以在docker 初始化时启动 swarm 模式或者加入已存在的 swarm,从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具。
swarm 集群节点的管理命令:docker swarm --help- 初始化集群节点
- 加入节点
- 退出节点
- Node
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。 - Task
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。 - Service
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:- replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
- global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定
实际应用
集群搭建
初始化集群
登录管理节点,并执行如下命令
docker swarm init --advertise-addr 192.168.113.120
使用 docker info 可以查看 swarm 集群状态
docker node ls 可以查看集群节点信息
增加工作节点
分别在两个工作节点上执行加入节点命令
docker swarm join \
-- token 集群初始化时的 token 信息 \
192.168.113.120:2377
查看集群
进入主节点,输入如下命令查看集群节点信息
docker node ls
部署服务
新建服务
进入主节点,创建一个 helloworld 服务
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx
命令结束:
docker service create 创建一个服务
--name 设置服务名称
--replicas 设置启动多少个实例
通过 docker service ps <service id> 可以查看服务信息
通过 docker service ls 可以查看 Swarm 集群下运行的所有服务
监控集群状态
查看服务信息:
docker service inspect --pretty <service id>
--pretty 参数可以简化输出内容
docker service ps <service id> 可以查看运行中的服务信息
进入工作节点通过 docker ps 可以查看容器运行状态
弹性伸缩
调整实例个数
更新服务的实例个数:
docker service update --replicas <num> <service id/name>
调整集群大小
添加新的 Docker 节点,执行 docker swarm join 命令可以加入集群
执行 docker swarm leave 可以退出集群,也可以带上 --force 参数强制退出集群
可视化工具 Portainer
Portainer是一款轻量级可视化工具,基于图形界面来对Docker进行管理
docker search portainer 搜索 portainer,选择自己需要的版本进行下载
# 基于 docker 运行
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
# 基于 swarm 运行
docker service create -p 9000:9000 --replicas 1 --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer
项目实战
Docker Desktop on Windows
- 开启虚拟化服务
进入控制面板 > 程序 > 启用或关闭 Windows 功能,开启Hyper-V、适用于 Linux 的 Windows 子系统、虚拟机平台
如果服务中没有 Hyper-V,创建一个文本文件,保存下方内容
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
保存后,将文本文件后缀修改为 cmd,并且用管理员身份运行,运行完成后输入 y 重启电脑,之后再打开 Hyper-V 就可以运行了。
- wsl 安装 ubuntu
- 安装
# 设置 wsl2 为默认版本
wsl --set-default-version 2
# 安装 ubuntu
wsl --install -d Ubuntu
# 安装完成后,重新打开的窗口需要输入新的 linux 用户名与密码
# 用户名密码填完后,使用 PowerShell 查看当前版本,确认版本是否为 2,如果为 2 则不用升级
wsl -l -v
- 升级 wsl2
如果以前已经装过其他 linux 子系统,且 wsl 版本为 1 的,按照以下步骤升级
`.执行并安装 wsl_update_x64.msi
2.设置 wsl2 为默认版本 wsl --set-default-version 2
2.查询需要升级的版本 wsl -l -v
4.选择对应的版本升级 wsl --set-version <第三步查到的名称> 2
5.输出转换完成后表示成功,通过 wsl -l -v 再次确认版本是否转换成功
- 安装 Docker Desktop
- 闪退问题
基于第一步开启对应的三个功能 - 一直卡在 Docker engine starting
如果出现一直卡在 Engine starting,按住 shift 键在任意空白位置右键,打开 Power Shell,并执行如下两行命令
cd "C:\Program Files\Docker\Docker"
./DockerCli.exe -SwitchDaemon
- 客户端设置
-
启用 wsl 虚拟机子系统
在设置界面中找到 Resources > WSL Integration 选项
勾选 Enable integration with my default WSL distro
且启用下方你所安装的 linux 子系统,如 Ubuntu
修改完成后,点击右下方的 Apply & restart 按钮重启 Docker -
配置仓库与镜像
找到设置页面中的 Docker Engine,进去以后修改原先的 json 文件,加入如下内容
insecure-registries:信任的仓库列表,用于 pull/push 镜像
registry-mirrors:镜像仓库列表,用于提升镜像下载速度
"insecure-registries": [
"192.168.113.121:5000",
"192.168.113.121:5001"
],
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
修改完毕后点击右下方的 Apply & restart 按钮
IntelliJ IDEA 构建 Docker 镜像
常见插件maven插件
Spring Boot Maven 打包插件内置的 build-image
官方文档:https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#build-image
Spring Boot 2.3 版本后默认集成了用于构建 Maven 镜像的插件,只要是 Spring Boot 项目,就可以直接使用,前提是本地环境中安装了 Docker。
命令:
mvn spring-boot:build-image
拓展配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定打包后的镜像名 -->
<imageName>${groupId}/${project.artifactId}:${project.version}</imageName>
<docker>
<!-- 配置发布的仓库信息 -->
<publishRegistry>
<url>http://xxx:xx</url>
<username>xxx</username>
<password>xxx</password>
</publishRegistry>
</docker>
</configuration>
</plugin>
Google 的 jib-maven-plugin
Jib 是一个 Maven 和 Gradle 插件,用来创建 Docker 镜像。它最大的特点是,你的本地可以没有 Docker 也可以进行构建,同样也不需要编写 Dockerfile 文件,不用改动代码,甚至不用修改 pom.xml 文件,运行如下命令即可:
mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild
Spotify 的 dockerfile-maven-plugin
专门基于 Dockerfile 构建镜像的插件,也是目前市面上用的比较多的镜像构建方式之一。
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<!-- 自定义构建、推送命令 -->
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 打包后的完整镜像名:仓库路径/组织/镜像名 -->
<repository>IP:port/xxx/${project.artifactId}</repository>
<!-- 镜像版本号 -->
<tag>${project.version}</tag>
<!-- 读取 settings.xml 文件中的认证信息 -->
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<!-- jar 所在目录 -->
<JAR_FILE>target/${project.artifactId}-${project.version}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
Dockerfile 配置
## 基础镜像
## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
FROM eclipse-temurin:8-jre
## 作者
MAINTAINER xxx
## 定义参数
ARG JAR_FILE
## 创建并进入工作目录
RUN mkdir -p /xxx
WORKDIR /xxx
## maven 插件构建时得到 buildArgs 种的值
COPY ${JAR_FILE} app.jar
## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx256m"
## 暴露端口
EXPOSE 8080
## 容器启动命令
## CMD 第一个参数之后的命令可以在运行时被替换
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
构建镜像
mvn dockerfile:build
推送镜像到仓库
在 maven 的 settings.xml 文件的 servers 标签中,增加服务认证配置信息
<server>
<id>192.168.113.121:5000</id>
<username>admin</username>
<password>wolfcode</password>
</server>
mvn dockerfile:push
镜像构建项目实战
实战项目包括Java Web项目、Springboot项目和Spring Cloud 微服务项目,相关项目代码:https://download.csdn.net/download/codezxhy/89500853
- 点赞
- 收藏
- 关注作者
评论(0)