一. Docker介绍
1.1 引言
- 场景1: 我本地运行没问题啊
- 场景2: 哪个哥们又写死循环了, 怎么这么卡
- 场景3: 淘宝在双11的时候, 用户量暴增
- 场景: 学习一门技术, 学习安装成本过高
1.2 Docker的由来
- 一帮年轻人, 创办了一家公司, 2010年的时候专门做PAAS平台
- 到了2013年的时候, 像亚马逊,微软, Google都开始做PAAS平台
- 2013年, 将公司内的核心技术对外开源, 核心技术就是Docker
- 到了2014年的时候, 得到了C轮的融资,$4000W
- 到了2015年的时候, 得到了D轮的容器,$9500W
- 最终可以全神贯注的维护Docker
- 所罗门是主要作者之一, 现已离开Docker团队
1.3 Docker的思想
- 集装箱
- 会将所有需要的内容放到不同的集装箱中, 谁需要这些环境直接拿到这个集装箱就可以了
- 标准化
- 运输的标准化: Docker有一个码头, 所有上传的集装箱都放在了这个码头上, 当谁需要某一个环境, 就直接派大鲸鱼去搬运这个集装箱
- 命令的标准化: Docker提供了一系列的命令, 帮助我们去获取集装箱
- 提供了REST的API: 衍生出了很多的图形化界面: Rancher
- 隔离性
- Docker在运行集装箱中的内容时, 会在Linux的内核中, 单独的开辟一片空间, 这片空间不会影响到其他程序
- 注册中心 (超级码头, 上面放的就是集装箱)
- 镜像 (集装箱)
- 容器 (运行起来的镜像)
二. Docker的基本操作
2.1 安装Docker
| |
| yum -y install yum-utils device-mapper-persistent-data lvm2 |
| |
| |
| yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
| |
| |
| yum makacache fast |
| yum -y install docker-ce |
| |
| |
| |
| systemctl start docker |
| |
| systemctl enable docker |
| |
| docker run hello-world |
| |
| |
| Hello from Docker! |
| This message shows that your installation appears to be working correctly. |
| |
| To generate this message, Docker took the following steps: |
| 1. The Docker client contacted the Docker daemon. |
| 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. |
| (amd64) |
| 3. The Docker daemon created a new container from that image which runs the |
| executable that produces the output you are currently reading. |
| 4. The Docker daemon streamed that output to the Docker client, which sent it |
| to your terminal. |
2.2 Docker的中央仓库
-
Docker官方的中央仓库: 这个仓库是最全的, 但是下载速度较慢
-
国内的镜像: 网易蜂巢, daoCloud...
-
在公司内部会采用私服的方式拉取镜像 (需要添加配置)
2.3 镜像的操作
| |
| docker pull 镜像名称[:tag] |
| |
| docker pull daocloud.io/library/tomcat:8.5.16-jre8 |
| |
| |
| |
| docker save -o 导出的路径 镜像ID |
| |
| docker load -i 镜像文件 |
| |
| docker tag 镜像ID 新镜像名称:版本 |
| |
2.4 容器的操作
| |
| |
| docker run 镜像ID|镜像名称[:tag] |
| |
| docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像ID|镜像名称[:tag] |
| |
| |
| |
| |
| |
| |
| |
| docker exec -it 容器ID /bin/bash |
| |
| docker exec -it 容器ID bash |
| |
| |
| docker stop 容器ID |
| |
| docker stop $(docker ps -qa) |
| |
| docker rm 容器ID |
| |
| docker rm $(docker ps -qa) |
| |
| |
| |
| /var/lib/docker |
| |
| /var/lib/docker/containers |
| |
| /var/lib/docker/containers/43a9ba041db6f1130b26da8dd041bae32a3a14ee96f6a1491b72679708da8551 |
| |
| |
| |
| "PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"8088"}]} |
| |
| |
| "ExposedPorts":{"8080/tcp":{}},"Tty":false |
| |
| |
| docker restart 容器ID |
三. Docker应用
3.1 准备SSM工程
3.2 准备MySQL容器
| |
| docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4 |
3.3 准备Tomcat容器
| |
| |
| docker cp 文件名称 容器ID:容器内部路径 |
| |
| docker cp ssm1.war 43:/usr/local/tomcat/webapps/ |
3.4 数据卷
- 上面为了部署SSM工程, 需要使用cp命令将宿主机内的ssm1.war文件复制到容器内部, 有些麻烦, 所以我们可以使用数据卷的方式
- 数据卷: 将宿主机的一个目录映射到容器的一个目录中, 在宿主机中操作改变目录中的内容, 容器目录内部映射的文件, 也会跟着一起改变
| |
| docker volume create 数据卷名称 |
| |
| |
| |
| docker volume inspect 数据卷名称 |
| |
| |
| |
| docker run -v 数据卷名称:容器内部路径 镜像ID |
| |
| docker volume create volume_ssm1_tomcat |
| docker run -d -p 8080:8080 --name ssm1_tomcat -v volume_ssm1_tomcat:/usr/local/tomcat/webapps b2 |
| |
| docker run -v 路径:容器内部路径 镜像ID |
| |
| docker run -d -p 8080:8080 --name ssm1_tomcat -v /opt/volumn_ssm1_tomcat:/usr/local/tomcat/webapps b2 |
| cd /opt/volumn_ssm1_tomcat/ |
| mkdir ROOT |
| cd ROOT/ |
| vi index.html |
| |
四. Docker自定义镜像
- 中央仓库上的镜像, 也是Docker用户自己上传上去的
| |
| |
| from: 指向当前自定义镜像依赖的环境 |
| copy: 将相对路径下的内容复制到自定义镜像中 |
| workdir: 声明镜像的默认工作目录 |
| cmd: 需要执行的命令(是在workdir下执行的,cmd可以写多个, 但只以最后一个为准) |
| |
| from daocloud.io/library/tomcat:8.5.16-jre8 |
| copy ssm1.war /usr/local/tomcat/webapps |
| |
| |
| docker build -t 镜像名称:[tag] . |
| |
| cd ~ |
| mkdir ssm1-tomcat |
| cd ssm1-tomcat |
| |
| docker build -t ssm1-tomcat:1.0.0 . |
| docker images |
| docker run -d -p 8082:8080 --name custom-ssm1-tomcat 78 |
| docker ps |
五. Docker-Compose
- 之前我们运行一个镜像, 需要添加大量的参数
- 现在我们可以通过Docker-Compose来编写这些参数
- Docker-Compose可以帮助我们批量的管理容器
- 只需要通过一个Docker-Compose.yml文件去维护即可
5.1 下载Docker-Compose
| |
| https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64 |
| |
| |
| |
| cd ~ |
| mv docker-compose-Linux-x86_64 /usr/local |
| |
| |
| cd /usr/local |
| mv docker-compose-Linux-x86_64 docker-compose |
| ll |
| chmod 777 docker-compose |
| |
| |
| |
| mv docker-compose /usr/local/bin |
| vi /etc/profile |
| |
| |
| |
| |
| |
| Define and run multi-container applications with Docker. |
| |
| Usage: |
| docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] |
| docker-compose -h|--help |
| |
| Options:... |
| Commands:... |
5.2 Docker-Compose管理MySQL和Tomcat容器
- yml文件以key: value方式来指定配置信息
- 多个配置信息以换行+缩进的方式来区分
- docker-compose.yml
| version: '3.1' |
| services: |
| mysql: |
| restart: always |
| image: daocloud.io/library/mysql:5.7.4 |
| container_name: mysql |
| ports: |
| - 3306:3306 |
| environment: |
| MYSQL_ROOT_PASSWORD: root |
| TZ: Asia/Shanghai |
| volumes: |
| - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql |
| tomcat: |
| restart: always |
| image: daocloud.io/library/tomcat:8.5.16-jre8 |
| container_name: tomcat |
| ports: |
| - 8080:8080 |
| environment: |
| TZ: Asia/Shanghai |
| volumes: |
| - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps |
| - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs |
| |
| cd /opt/ |
| mkdir docker_mysql_tomcat |
| cd docker_mysql_tomcat |
| vi docker-compose.yml |
| |
| docker stop $(docker ps -qa) |
| docker rm $(docker ps -qa) |
| |
5.3 使用docker-compose命令管理容器
| |
| |
| docker-compose start|stop|restart |
5.4 dcoker-compose配置Dockerfile使用
- 使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像, 并且由docker-compose去管理容器
- docker-compose.yml文件
| |
| version: '3.1' |
| services: |
| ssm: |
| restart: always |
| build: |
| context: ../ |
| dockerfile: Dockerfile |
| image: ssm:1.0.1 |
| container_name: ssm |
| ports: |
| - 8081:8080 |
| environment: |
| TZ: Asia/Shanghai |
| from daocloud.io/library/tomcat:8.5.16-jre8 |
| copy ssm1.war /usr/local/tomcat/webapps |
| |
| |
| docker-compose up -d |
| |
| |
| docker-compose build |
| |
| docker-compose up -d --build |
六. Docker CI, CD
6.1 引言
- 项目部署
- 将项目通过maven进行编译打包
- 将文件上传到指定的服务器中
- 将war包放到tomcat的目录中
- 通过Dockerfile将Tomcat和war包转成一个镜像, 由DockerCompose去运行容器
- 项目更新了
6.2 CI介绍
- CI (continuous intergration) 持续集成
- 持续集成: 编写代码时, 完成了一个功能后, 立即提交代码到Git仓库中, 将项目重新的构建并且测试
6.3 实现持续集成
6.3.1 搭建Gitlab服务器
- 创建一个全新的虚拟机, 并且至少指定4G的运行内存
- 安装docker以及docker-compose
- 将ssh的默认22端口, 修改为60022端口
| vi /etc/ssh/sshd_config |
| |
| systemctl restart sshd |
| |
- docker-compose.yml文件去安装gitlab(下载和运行的时间是比较长的)
| 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_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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步