学习视频:https://www.bilibili.com/video/BV1sK4y1s7Cj
2020 Docker最新超详细版教程通俗易懂(Eric老师)

一. Docker 介绍

1.1 引言

  1. 我本地运行没有问题啊(环境不一致问题)
  2. 哪个哥们又写死循环了,怎么这么卡(在多用户的操作系统上,会相互影响)
  3. 淘宝在双11的时候,用户量暴增(运维成本过高问题)
  4. 学习一门技术学习成本过高(关于安装成本过高问题)

1.2 Docker的由来

一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。

到了2013年的时候,像亚马逊、微软、Google都开始做PAAS平台。

2013年,将公司内的核心技术对外开源,核心技术就是Docker。

到了2014年的时候,得到了C轮的融资.$4000w。

到了2014年的时候,得到了D轮的融资.$9500w。

全神贯注的维护Docker。

所罗门主要作者之一。

1.3 Docker思想

1.集装箱

会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了

  1. 标准化:

    运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接派大海豚去运输集装箱就可以了。

    命令的标准化:Docker提供了一系列的命令,帮助我们去获取集装箱等等操作。

    提供了REST的API:衍生出了很多的图形化界面,Rancher.

  2. 隔离性:

    Docker 在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

注册中心:超级码头,上面放的就是集装箱

镜像:集装箱

容器:运行起来的镜像

二. Docker 的基本操作

2.1 安装Docker

# 1. 下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
# 2. 设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安装Docker
yum makacache fast
yum -y install docker-ce

执行命令报错

[root@iZ2ze60her827o3v5u8uypZ ~]# yum makacache fast
No such command: makacache. Please use /usr/bin/yum --help
It could be a YUM plugin command, try: "yum install 'dnf-command(makacache)'"
[root@iZ2ze60her827o3v5u8uypZ ~]# yum -y install docker-ce
Docker CE Stable - x86_64                                                               162 kB/s |  25 kB     00:00    
Error: 
 Problem: package docker-ce-3:19.03.13-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.13-3.1.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.13-3.2.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.2-3.3.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.2-3.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.4-3.1.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.5-3.1.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.6-3.3.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.3.7-3.1.el7.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate p

原因:当前系统yum库中没有符合最新版docker-ce对应版本的containerd.io,docker-ce-3:19.03.11-3.el7.x86_64需要containerd.io >= 1.2.2-3
解决方案:

# 输入下列命令
[root@iZ2ze60her827o3v5u8uypZ ~]# yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm 
[root@iZ2ze60her827o3v5u8uypZ ~]# sudo yum -y install docker-ce docker-ce-cli
# 找到指定版本的docker-ce跟containerd.io
Installed:
  docker-ce-3:19.03.13-3.el7.x86_64       docker-ce-cli-1:19.03.13-3.el7.x86_64       libcgroup-0.41-19.el8.x86_64   
 # 安装指定版本的docker-ce跟containerd.io
[root@iZ2ze60her827o3v5u8uypZ ~]#  sudo yum install docker-ce-docker-ce-19.03.13-3.el7.x86_64.rpm docker-ce-cli-docker-ce-cli-19.03.13-3.el7.x86_64.rpm containerd.io
# 4. 启动设置为开机自动启动,测试
# 启动Docker服务
systemctl start docker
# 设置开启自动启动
systemctl enable docker
# 测试
docker run hello-world
# 出现下列内容表示docker已经安装成功
[root@bjwuzh docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

2.2 Docker 的中央仓库

  1. Docker官网的中央仓库:这个仓库是镜像最全的,但是下载速度最慢

    https://hub.docker.com/

  2. 国内的镜像网站:网易蜂巢,daoCloud

    https://c.163yun.com/hub#/home

    http://hub.daocloud.io(推荐使用)

  3. 在公司内部会采用私服的方式拉取镜像(添加配置)

# 需要在/etc/docker/daemon.json中修改
{
	"registry-mirrors":["https://registry.docker-cn.com"],"insecure-registries":["ip:port"]
}
# 重启两个服务
systemctl daemon-reload
systemctl restart docker

2.3 镜像的操作

# 1. 拉取镜像到本地
docker pull 镜像名称[:tag]
# 例如:
docker pull daocloud.io/library/tomcat:8.5.15-jre8
# 2. 查看全部本地镜像
docker images
# 3. 删除本地镜像
docker rmi 镜像的标识
# 4. 镜像的导入导出(不规范)
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

2.4 容器的操作

# 1. 运行容器
# 简单操作
docker run 镜像标识|镜像名称[:tag]
# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像标识|镜像名称[:tag]
# -d: 代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:执行容器的名称
# 2. 查看正在运行的容器
docker ps [-qa]
# -a:查看全部的容器,包括没有运行的
# -p:只查看容器的标识
# 3.查看容器的日志
docker logs -f 容器id
# -f :可以滚动查看日志的最后几行
# 4. 进入容器内部
docker exec -it 容器id bash
# 5. 删除容器(删除容器前,需要先停止容器)
# 停止指定的容器
docker stop 容器id
# 定制全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
# 6. 启动容器
docker start 容器id

三. Docker应用

3.1 准备litemall.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>3</title>
<script>
function r()
{
var username=document.getElementById("username");
var pass=document.getElementById("password");
if(username.value=="")
{
dualert("请输入用户名zhi");
username.focus();
return;
}
if(pass.value=="")
{
alert("请输入密码");
return;
}
return true;
}
</script>
</head>
<body>
<form>
<table width="350" bgcolor="#ccffcc" style="border-color" border="1">
<tr align=center>
<td>用户名</td><td><input type="text" name="username" id="username"></td>
</tr>
<tr align=center><td>密 码</td><td><input type="password" name="password" id="password"></td></tr>
<tr align=center><td>验证码</td><td><input type="text" name="yanzheng"></td></tr>
<tr align=center><td colspan="2"><input type="button" value="登 录" onclick="r();"/>
<input type="reset" value="重 置"/></td></tr>
</table>
</form>
</body>
</html>

3.2 准备MySQL容器

# 运行MySQL容器
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

3.3 准备Tomcat容器

# 运行Tomcat容器,并且把litemall.html包部署到Tomcat容器内部
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
# 通过命令将宿主机的内容拷贝到容器内部
docker cp 文件名称 容器id:容器内部路径
docker cp xxx.war 容器id:/usr/local/tomcat/webapps/ROOT

3.4 数据卷

为了部署litemall的工程,需要使用到cp的命令将宿主机内的litemall.war文件复制到容器内部

数据卷:将宿主机的目录映射到容器中的一个目录

可以在宿主机中操作目录中的内容,那么容器内部的内容也改变

# 1. 创建数据卷
docker volume create 数据卷名称
# 创建数据卷之后,默认会存放在一个目录下/var/lib/docker/volumen/数据卷名称/_data
# 2. 查看数据卷的详细信息
docker volume inspect 数据卷名称
# 3. 查看全部数据卷
docker volume ls
# 4. 删除数据卷
docker volumen rm 数据卷名称
# 5. 应用数据卷
# 当你映射数据卷时,如果数据卷不存在,Docker会自动创建
docker run -v 数据卷名称:容器内部的路径 镜像id
# 指定一个路径作为数据卷的存放位置
docker run -v 路径:容器内部路径 镜像id

四. Docker自定义镜像

中央仓库上的镜像,也是Docker的用户自己上传上去的。

# 1. 创建一个Dockerfile文件,并且指定自定义镜像信息
# Dockerfile文件中常用的内容
from :指定当前自定义镜像依赖的环境
copy : 将相对路径下的内容负责到自定义的镜像中
workdir : 声明镜像的默认工作路径
cmd : 需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)
# 例如,自定义一个tomcat镜像,并且将ssm.vaar部署到tomcat中
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 2. 将准备好的Dickerfile和相应的文件拖拽到Linux操作系统中,通过Docker的命令制作镜像
docker build -t 镜像名称[:tag] .

五. Docker-Compose

执行运行一个镜像,需要添加大量的参数。

可以通过Docker-Compose编写这些参数。

Docker-Compose可以帮助我们批量的管理容器。

只需要通过一个docker-compose.yml文件去维护即可。

5.1 下载Docker-Compose

# 1. 去github 官网搜索docker-compose,下载1.24.1版本的Docker-Compose
http://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64

# 2. 将下载好的文件,拖拽到Linux操作系统中
# 3. 需要将DockerCompose文件的名称修改一些,基于DockerCompose 文件一个执行权限
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-comppse

# 4. 方便后期操作,配置一个环境变量
# 将docker-compose文件移动到了/usr/local/bin目录下,修改了/ect/profile文件,给/usr/local/bin配置到了PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
export PATH=$JAVA_HOME:/usr/local/bin:$PATH
# 重新加载/etc/profile使之生效
source /etc/profile

# 5. 测试一下
在任意一个目录下执行docker-compose

5.2 Docker-Compose管理MySQL和Tomcat容器

yml文件以key:value方式来指定配置信息
多个配置信息以换行+缩进的方式来区分
在docker-compose.yml文件中,不要使用制表符

version: '3.1'
services:
  mysql: # 服务的名称
    restart: always  # 代表只要docker启动,容器就启动
    image: daocloud.io/library/mysql:5.7.4 # 指定镜像路径
    container_name: mysql # 指定容器名称
    ports:
      - 3306:3306  # 指定端口的映射
    environment:
      MYSQL_ROOT_PASSWORD: root # 指定mysql的root用户的密码
      TZ: Asia/Shanghai  # 指定时区
    volumes:
      - /opt/docker_mysql/data:/var/lib/mysql  # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_tomcat/tomcat_logs:/usr/local/tomcat/logs

5.3 使用docker-compose命令管理容器

在使用docker-compose 的命令时,默认会在当前目录下找docker-compose.yml文件

# 1. 基于docker-compose.yml 启动管理的容器
docker-compose up -d
# 2. 关闭并删除容器
docker-compose down
# 3. 开启|关闭|重启已经存在的有docker-compose维护的容器
docker-compose start|stop|restart
# 4. 查看由docker-compose管理的容器
docker-compose ps
# 5. 查看日志
docker-compose logs -f

5.4 docker-compose配置Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器

# docker-compose.yml文件
version: '3.1'
services:
  ssm:
    restart: always
    build:          # 构建自动化镜像
      context: ../  # 指定dockerfile文件的所在路径
      dodckerfile: Dockerfile  # 指定Dockerfile文件名称
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 8081:8080
     environment:
       TZ: Asia/Shanghai
# Dockerifle文件
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
# 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
# 如果自动化镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
# 重新构建自定义镜像
docker-compose build
# 运行前,重新构建
docker-compose up -d --build

六. Docker DI、CD

6.1 引言

项目部署

  1. 将项目通过maven进行编译打包
  2. 将文件上传到指定的服务器中
  3. 将war包放到tomcat的目录中
  4. 通过Dockerfile将Tomcat和war包转成一个镜像,由DockerCompose去运行器

项目更新了

将上述流程再次重头执行一次

6.2 CI 介绍

CI(continuous intergration)持续集成

持续集成:编写代码时,完成了一个功能后,立即提交代码到Git仓库中,将项目重新的构建并且测试

​ 快速发现错误

​ 防止代码偏离主分支

6.3 实现持续集成

6.3.1 搭建Gitlab服务器

1、 创建一个全新的虚拟机,并且至少指定4G的运行内存

2、 安装docker以及docker-compose

3、将ssh的默认端口从22修改为60022

vi /etc/ssh/sshd_config
systemctl restart sshd

4、 docker-compose.yml文件去安装gitlab(下载和运行的时间比较长)

# 安装gitlab的docker-compose.yml文件
version: '3.1'
services:
  gitlab:
    image: 'twang2218/gitlab-ce-zh:11.1.4'
    container_name: "gitlab"
    restart: always
    privileged: true
    hostname: 'gitlab'
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.199.110'  # gitlab服务器ip
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['gitlab_shell_ssh_port'] = 22
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - /opt/docker_gitlab/config:/etc/gitlab
      - /opt/docker_gitlab/data:/var/opt/gitlab
      - /opt/docker_gitlab/logs:/var/log/gitlab

6.3.2 搭建GitLab-Runner

1、 准备环境

  • 复制daemon.json/etc/docker/,并执行systemctl daemon-reloadsystemctl restart docker
  • 创建工作目录 /opt/docker_gitlab-runner
  • 将提供好的docker-compose.yml文件以及environment目录全部复制到上述目录中
  • 在宿主机启动docker程序后先执行 sudo chown root:root /var/run/docker.sock(如果重启过docker,需要重新执行)
  • /opt/docker_gitlab-runner 目录中执行 docker-compose up -d --build 启动容器
  • 添加容器权限,保证容器可以使用宿主机的docker docker exec -it gitlab-runner usermod -aG root gitlab-runner
  • 注册Runner信息到gitlab
docker exec -it gitlab-runner gitlab-runner register

# 输入Gitlab地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.199.109/

# 输入Gitlab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh

# 输入Runner 的说明
Please enter the gitlab-ci description for this runner:
可以为空

# 设置Tag,可以用于指定在构建规定的 tag 时出发ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy

# 这里选择true , 可以用于代码上传后直接执行(根据版本,也会没有此选项)
Whether to run untagged builds [true/false]:
true

# 这里选择 false,可以直接回车,默认为false(根据版本,也会没有此选项)
Whether to lock Runner to current project [true/false]:
false

没有老师的文件,按照自己的方式按照gitlab runner

# 1. 跳转到gitlab runner仓库
[root@bjwuzh ~]# 
 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

# 2. 安装最新版本的gitlab runner
yum install gitlab-runner
# 3. 注册Runner信息到gitlab
docker exec -it gitlab-runner gitlab-runner register

获取URL
在这里插入图片描述

6.3.3 整合项目入门测试

1、创建maven工程,添加web.xml文件,编写html页面

2 、 编写gitlab-ci.yml文件

stages:
 - test
test:
 stage: test
 script:
   - echo first test ci # 输入的命令
  

3、 将maven工程推送到gitlab中

4、 可以在gitlab中查看到gitlab-ci.yml编写的内容

在这里插入图片描述

6.3.4 编写.gitlab-ci.yml文件

1、 编写.gitlab-ci.yml测试命令使用

stages:
  - test
test:
  stage: test
  script:
   - echo first test ci
   - /usr/local/maven/apache-maven-3.6.3/bin/mvn package   # 执行mvn package命令进行打包

2、 编写关于dockerfile以及docker-compose.yml文件的具体内容

# 1. Dockerfile文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps

# 2. docker-compose.yml文件
version: "3.1"
services:
  testci:
    build: docker
    restart: always
    container_name: testci
    ports:
      - 8080:8080
# 3. .gitlab-ci.yml文件,与项目中的docker目录同一层级
stages:
  - test
test:
  stage: test
  script:
   - echo first test ci
   - /usr/local/maven/apache-maven-3.6.3/bin/mvn package   # 执行mvn package命令进行打包
   - cp target/testci-1.0-SNAPSHOT.war docker/testci.war  # 将打包的war包拷贝到docker目录中
   - docker-compose down  # 如果有已经启动的容器,先关闭
   - docker-compose up -d --build # 重新构建
   - docker rmi $(docker images -qf dangling=true)  # 删除所有的镜像
   

3、 测试,访问网页

6.4 CD介绍

CD (持续交付,持续部署)

持续交付:将代码交给专业的测试团队去测试

持续部署:将测试通过的代码,发布到生产环境

在这里插入图片描述

6.5 实现持续交付持续部署

6.5.1 安装Jenkins

官网:https://www.jenkins.io

version: '3.1'
services:
  jenkins:
    image: jenkins/jenkins
    restart: always
    container_name: jenkins
    ports: 
      - 8888:8080
      - 50000:50000
    volumes:
      - ./data:/var/jenkins_home

第一次运行时,会因为data目录没有权限,导致启动失败

chmod 777 data

访问Jenkins http://192.168.199.109:8888

输入密码

手动指定插件安装:指定下面两个插件即可

publish ssh …

git parameter …

安装成功后,需要指定用户名和密码

6.5.2 配置目标服务器及GitLab免密码登录

GitLab -> Jenkins -> 目标服务器

1、Jenkins 去连接目标服务器

1. Manage Jenkins-> Configure System 
2. 搜索Publish Over SSH -> 新增

在这里插入图片描述

6.5.3 配置GitLab免密码登录

1、登录Jenkins容器内部

docker exec -it jenkins bash

2、输入生成SSH秘钥命令

ssh-keygen -t rsa -C "邮箱"

3、将秘钥复制到GitLab的SSH中

在这里插入图片描述

6.5.4 配置JDK和Maven

1、复制本地的jdk和maven的压缩包到data目录下

2、手动解压
在这里插入图片描述
在这里插入图片描述

3、在Jenkins的控制面板中配置JDK和Maven

在这里插入图片描述

6.5.5 手动拉取gitlab 项目

使用SSH无密码连接时,第一次连接需要手动确定
在这里插入图片描述

6.5.6 创建maven任务

1、创建maven工程

2、 Jenkins的监控页面中创建maven任务
在这里插入图片描述
在这里插入图片描述

3、执行maven任务

6.6 实现持续交付持续部署

1、安装Git parameter 的插件,Persistent Parameter的插件(可能版本不一样,支持的Parameter也不一样)

2、重新指定构建项目的方式
在这里插入图片描述
在这里插入图片描述

3、构建项目成功后,需要将内容发布到目标服务器
在这里插入图片描述

4、修改程序代码(提交到GitLab仓库中)

# Dockerfile文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps
# docker-compose文件
version: '3.1'
services:
  testcd:
    build: docker
    restart: always
    container_name: testcd
    ports:
      - 8081:8080

5、测试

  1. 给当前版本添加tag标签
  2. 在Jenkins中构建项目时选择相应的tag
  3. 点击查看日志
  4. 去指定的目标服务器中访问具体服务
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐