Docker容器化部署
docker
Docker提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定的主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的所有内容,因此不需要依赖主机上当前安装的内容。您可以轻松地在工作时共享容器,并确保与您共享的每个人都获得相同的容器,该容器以相同的方式工作。
使用docker可以做什么
-
快速、一致地交付应用程序
Docker通过允许开发人员在标准化的环境中使用本地容器(这些容器为您提供应用程序和服务)来简化开发生命周期。容器非常适合于连续集成和连续交付的工作流。
-
快速部署和扩展
Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑、数据中心的物理或虚拟机、云提供商或多种环境中运行。
Docker的可移植性和轻量级特性还使得动态管理工作负载、根据业务需求以近乎实时的方式扩展或删除应用程序和服务变得非常容易。
-
在同一硬件上运行更多工作负载
Docker重量轻,速度快。它为基于虚拟机管理程序提供了一个可行的、经济高效的替代方案,因此您可以使用更多的计算能力来实现业务目标。Docker非常适合高密度环境和中小型部署,在这些环境中,您需要用更少的资源做更多的工作。
docker架构
Docker使用client-server体系结构。The Docker client 与 the Docker daemon通信,后者负责构建、运行和分发Docker containers。The Docker client 与 the Docker daemon可以在同一系统上运行,也可以将The Docker client 连接到远程的the Docker daemon。The Docker client 与 the Docker daemon使用REST API 通过UNIX套接字或网络接口进行通信。其中一个 Docker client为Docker Compose,它允许您处理由一组容器组成的应用程序。
-
The Docker daemon
侦听Docker API请求并管理Docker Objects,如images, containers, networks, and volumes。其还可以与其他Docker daemon一起管理Docker服务。
-
The Docker client
是许多Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时, Docker client将这些命令发送给docker,由docker执行这些命令。 Docker client可以与多个Docker daemon通信。
-
Docker registries
为存储docker Images的,docker hub就是一个公共的任何人都可以用的存储docker images的一个仓库,默认情况下,docker都从docker hub上拉去镜像。当然我们也可以创建一个自己的仓库。
-
Docker objects
-
Images(镜像)
为创建一个docker 容器的一个只读的模板,通常一个镜像是基于另外一个对象,并做了一些自定义创建的,比如我们自己开发的java程序,我们需要将其打包为一个镜像,则需要基于jdk做一次镜像构建,让他运行我们的java程序。
-
Containers(容器)
容器为一个运行的镜像实例,可以使用对应的docker api 进行容器的创建、删除、启动等等操作。默认情况下,容器与其他容器及其主机的隔离相对较好。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
-
docker安装与卸载
-
docker支持的环境
-
docker在线安装
在新主机上首次安装 Docker EC 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
# step 1:安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2;
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
或者
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
或者
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
#Step 5: 检查 Docker 成功否
docker version
#Step 6: 配置加速器
vim /etc/docker/daemon.json //如果没有该文件,请新建。
将这段内容复制进daemon.json
{
“registry-mirrors”: [“https://kdu301wo.mirror.aliyuncs.com”] #阿里云加速
}
systemctl daemon-reload 重新加载配置
service docker restart 重启docker服务
sudo systemctl enable docker 设置docker开机自启动
-
docker离线安装
# step 1:复制docker-ce-19.03.9.tgz安装文件至服务器,并使用解压命令进行解压:tar xzvf docker-ce-19.03.9.tgz
# step 2:拷贝解压后docker文件下的所有文件至 /usr/bin/文件下: cp docker/* /usr/bin/
# step 3:编辑docker.service文件内容为下面的内容:vim /etc/systemd/system/docker.service
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target
# step 4:修改权限docker.service文件的权限:chmod +x /etc/systemd/system/docker.service
# step 5:重新加载配置:systemctl daemon-reload
# step 6:设置开机自启:systemctl enable docker.service
# step 7:启动docker: systemctl start docker
# step 8:运行docker version 查看docker的版本,验证docker是否安装成功
-
docker卸载
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
docker常用命令介绍
参考地址: https://docs.docker.com/engine/reference/run/
-
拉取镜像
docker pull 镜像名称;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWXSMrgc-1624516368294)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210607193724146.png)]
-
查询所有的容器
docker ps -a
-
查询启动的容器
docker ps
-
启动容器
docker start 容器名称/容器id
-
停止容器
docker stop 容器名称/容器id
-
停止所有的容器
docker stop $(docker ps -aq)
-
重启容器
docker restart 容器名称/容器id
-
删除容器
docker rm 容器名称/容器id
-
删除所有的容器
docker rm $(docker ps -aq)
-
进入容器
docker exec -it 容器名称/容器id /bin/bash
-
查看容器运行日志
docker logs -f 容器名称/容器id //查看docker 容器日志、从第一行读
或者
docker logs -f 容器名称/容器id --tail 行号 //查看docker 容器日志,从最后1000行开始读
-
查询镜像
docker images
-
删除镜像
docker rmi 镜像名称
-
删除所有镜像
docker rmi $(docker images -q)
-
docker创建容器示例
docker run
例如: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7.29
run命令的常用参数介绍(参考地址:https://docs.docker.com/engine/reference/commandline/run/)
-
根据dockerFile构建镜像
docker build [OPTIONS] PATH | URL | -
build命名的参考地址:https://docs.docker.com/engine/reference/commandline/build/
举例: 使用当前目录的 Dockerfile 创建镜像,标签为 archive-moudle:1.0。
docker build -t archive-module:1.0 .
-
容器与宿主机之间的文件拷贝
(1)容器至宿主机: docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
例如: docker cp redis:/var/lib/redis /opt/redis
(2)宿主机至容器:docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
其他
-
目录挂载:运行某容器示例,对于映射到宿主机的配置文件,在启动容器时,提前在宿主机上进行创建,如果映射的配置文件不存在,会导致启动失败;首次创建容器时,可能不知道对应的配置文件中有哪些信息,可以选择在创建容器实例时,不进行文件的映射,启动成功后,使用docker cp命名将配置文件拷贝至宿主机在进行文件映射;
-
当需要在容器的配置文件中需要使用到文件路径时,配置的一定是容器内的路径,不是映射到宿主机的路径;如mysql,默认将数据存储在var/lib/mysql/data,我们将其映射到宿主机的/home/mysql/data,此时mysql的my.cnf里面配置的数据存储路径应该是var/lib/mysql/data
-
对于准备创建的容器,如何知道他的运行参数有哪些?如:mysql端口为3306
(1)自身的配置文件,如mysql的运行时的数据存储目录,日志目录,端口等都在my.cnf中;
(2)访问dockerhub(https://registry.hub.docker.com/),查看关于要使用的镜像的说明
docker-compose
docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose的安装
-
在线安装
#step 1 :安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-
uname -s
-uname -m
> /usr/local/bin/docker-compose#step 2 :设置用户权限
chmod +x /usr/local/bin/docker-compose
#step 3 :查看docker-compose是否安装成功
docker-compose --version
-
离线安装
(1)进入下面的网址下载对应版本的docker-compose文件:
https://github.com/docker/compose/releases
(2)将下载的docker-compose文件上传到 /usr/local/bin/ 文件夹下并将其重命名为docker-compose;
(3)修改此文件的权限,增加可执行:chmod +x /usr/local/bin/docker-compose
(4)运行 docker-compose --version
docker-compose.yml使用示例
version: '3'
services:
mysql:
hostname: mysql
image: mysql:5.7.29 #指定容器运行的镜像
# network_mode: "host" # 设置网络模式:network_mode: "bridge",network_mode: "host"
container_name: mysql # 指定容器名称,如果不设置此参数,则由系统自动生成
restart: always # 设置容器自启模式
environment: #环境变量设置
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
- MYSQL_ROOT_PASSWORD=root # 设置root密码
- MYSQL_USER='root'
- MYSQL_PASS='ruianxin@123'
volumes: #将主机的数据卷或着文件挂载到容器里
- /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
- ./mysql/data:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
- ./mysql/my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
ports:
- 3306:3306
redis:
container_name: redis
image: redis:6.0-rc3
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
environment: # -e 环境变量
- TZ=Asia/Shanghai # 设置时区为 上海
ports:
- 6379:6379
command: ["redis-server","/usr/local/etc/redis/redis.conf"] #容器启动时运行的命令
nginx:
container_name: nginx
restart: always
image: nginx:1.17.10
environment:
- TZ=Asia/Shanghai
ports:
- 8090:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
- ./nginx/web:/usr/share/nginx/html
# - ./nginx/ssl:/etc/nginx/ssl
docker-compose.yml的版式介绍
-
版式参考地址:https://docs.docker.com/compose/compose-file/compose-file-v3/
-
常用的版式指令截图介绍:
docker-compose常用命令介绍
参考地址: https://docs.docker.com/compose/reference/
-
docker-compose up [option]
构建、(重新)创建,启动服务;
(1)docker-compose up -d //表示在后台运行容器;(这个常用,在yml所在目录运行,构建或启动yml文件中配置的容器服务)
(2)docker-compsoe up //运行容器
-
docker-compose stop //停止正在运行的容器,可通过docker-compose start 启动
-
docker-compose stop 容器名称
-
docker-compose start //启动容器
-
docker-compose start 容器名称 //启动容器
-
docker-compose restart // 重启;
-
docker-compose restart 容器名称 // 重启;
-
docker-compose rm //删除停止的容器
-
docker-compose rm 容器名称 //删除容器
-
docker-compose ps //查看运行容器
dockerFile
什么是 DockerFile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
名词介绍
- 上下文目录/上下文路径: 是指 docker 在构建镜像,想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。(上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢)
dockerFile指令
参考地址:https://docs.docker.com/engine/reference/builder/
docker指令
-
FROM
当前镜像是基于哪个镜像进行构建
-
RUN
构建镜像时需要运行的命令
-
EXPOSE
当前容器对外暴露的端口号,例如mysql的3306;
示例:EXPOSE 80/udp 或者EXPOSE 8080/TCP
说明:没有指定协议时,默认为TCP
-
WORKDIR
指定在创建容器后,终端默认登录进容器时的工作目录;
-
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
示例: 使用PORT指定端口为8090 ——ENV PORT=8090 或者ENV PORT 8090
可以使用ENV PORT=8090 PATH=/home/docker 实现一次指定多个变量,当然也可以写多个ENV指令
后续使用: + 变 量 名 例 如 : +变量名 例如: +变量名例如:PORT
-
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径
示例: COPY home/docker/a.text /var/lib
-
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
-
VOLUME
-
CMD
类似于 RUN 指令,用于运行程序(为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。),但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
示例:CMD [“java”,"-jar",“sys_module.jar”]
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
dockerFile的使用—demo
# 环境
FROM williamyeh/java8:latest
# 拷贝jar
ADD archive-module-1.0.0.jar /data/sysplat-boot/java/archive-module-1.0.0.jar
ADD logback-spring.xml /data/sysplat-boot/java/config/logback-spring.xml
ADD application-dm.yml /data/sysplat-boot/java/config/application-dm.yml
# 设置暴露的端口号
#EXPOSE 8761
# 执行命令
ENTRYPOINT ["java","-Xms256m", "-Xmx1024m","-Xss256m", "-jar", "-Dlogging.config=/data/sysplat-boot/java/config/logback-spring.xml","-Dspring.config.location=/data/sysplat-boot/java/config/application-dm.yml","/data/sysplat-boot/java/archive-module-1.0.0.jar"]
(1) 使用docker build 进行打包
docker build -t archive-module:1.0 .
(2)使用docker images 查看镜像,此时新增的镜像文件包括from的基础进行以及我们自己打包的镜像
镜像打包完成后,就可以进行常规的镜像操作,包括镜像上传、运行容器等。
(3)运行容器
docker run --name=archive-module -d -p 8080:8080 archive-module:1.0
docker镜像上传私服
-
对于docker私服,首先要准备好docker私服的端口,在进行docker部署的时候,提前将端口进行映射;docker默认使用的https请求,但是我们使用的nexus是http请求,可以在docker()将我们的地址加入安全配置中,采用http请求。
执行 vim /etc/docker/daemon.json 修改对应的文件
如果私服需要登录,则使用docker login 命名登录
-
对镜像进行tag(标记本地镜像,将其归入某一仓库),使用命令:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
示例: docker tag archive-module:1.0 192.168.0.223:5002/v1/archive-moudle:latest
-
上传镜像
从docker私服拉取镜像并运行
-
拉取镜像
-
运行容器
springboot项目打包成docker镜像
方式一:直接使用dockerfile文件
-
创建dockerfile文件
-
执行docker build命令
在上下文目录处执行docker build命令进行镜像构建
docker build -t archive-modu
方式二:使用maven插件
docker管理工具Portainer
Portainer官方文档地址:(https://documentation.portainer.io/)
demo地址:http://demo.portainer.io/#!/1/docker/host 账户:admin 密码:tryportainer
安装Portainer
(1)docker-compose.yml文件
portainer:
container_name: manage
image: portainer/portainer-ce:alpine
restart: always
ports:
- 9001:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer_data:/data
(2)访问ip+端口(首次登录需要注册账户,给admin账户设置密码)
(3)版本不一致可能存在差异,选择要管理docker还是k8s
备注说明:——新版本的发布将在portainer/portainer-ce上
使用简单介绍
(1)docker的基本情況
(2)镜像仓库
对我们的镜像仓库进行管理——添加、修改、删除;在镜像管理模块,我们可以指定从在此处配置的镜像仓库中拉取镜像。
点击添加按钮,进行镜像仓库的配置阶段,包括名称、url地址,如果有账号密码设置,填写账号、密码,配置完成。
(3)镜像管理
展示当前容器内的镜像列表,提供对镜像的基本操作——增、删、导入、导出等功能
(4)容器管理
展示当前docker中所有的容器,提供对容器的操作——启动、停止、重启、移除等
点击容器,可以查看当前容器的详细情况:容器创建时间、容器网络、容器运行日志、容器资源的占用情况等,同时可对当前容器进行操作——启动、停止、重启等等。
容器日志:
资源占用情况:
(5)配置私服地址,上传docker镜像
- nexus配置私服信息
- Portainer中配置私服地址
- 进入镜像页面,点击要上传到私服的镜像
- 进行tag
- 上传私服
nexus作为docker仓库
docker安装私服nexus
version: '3'
services:
nexus3:
image: "sonatype/nexus3"
container_name: nexus3
restart: always
ports:
- "8181:8081"
- "5001:5001"
- "5002:5002" #映射docker私服需要使用的端口
environment:
- CONTEXT_PATH=/
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
volumes:
- ./nexus/nexus-data:/nexus-data
注意事项:
(1)如果启动报错,可能是因为挂载的目录没有权限,对挂载目录进行权限设置后,重新启动,则可以启动成功。
(2)用户的默认用户为admin,密码存储在挂载出来的数据目录的admin.password文件中,登录后,可根据提示进行密码的修改。
(3)对于docker私服,首先要准备好docker私服的端口,在进行docker部署的时候,提前将端口进行映射;docker默认使用的https请求,但是我们使用的nexus是http请求,可以在docker方将我们的地址加入安全配置中,采用http请求。
执行 vim /etc/docker/daemon.json 修改对应的文件
使用nexus配置docker私服
- 点击新建
-
选择仓库类型
项目 具体说明 hosted 本地存储。像官方仓库一样提供本地私库功能 proxy 提供代理其它仓库的类型 group 组类型,能够组合多个仓库为一个地址提供服务
-
填写信息
(1)hosted类型的配置实例
(2)proxy配置实例
(3)group实例
微服务使用docker部署,服务注册时,ip、端口问题
Docker 资源汇总
Docker 资源
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: https://docs.docker.com/
- Docker Store: https://store.docker.com
- Docker Cloud: https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker 的源代码仓库: https://github.com/moby/moby
- Docker 发布版本历史: https://docs.docker.com/release-notes/
- Docker 常见问题: https://docs.docker.com/engine/faq/
- Docker 远端应用 API: https://docs.docker.com/develop/sdk/
Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc 的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)