如果一件事足够重要
即使成功率不高
你还是应该去做
一、Docker介绍
核心:docker是一种容器技术,把写好的代码和要运行的环境一起打包,解决软件跨环境迁移的问题。
二、安装Docker
安装命令
bash
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manage --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、安装docker
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
三、Docker架构
-
镜像(image):Docker镜像,就相当于是一个root文件系统。就像是一个一个打包好的软件包。
-
容器(container):镜像和容器的关系就像是java里的类和对象的关系。镜像是静态的定义,容器是运行的实体。容器可以被创建、启动、停止、删除、暂停。
-
仓库(repository):仓库可以看成一个代码控制中心,用来保存各种镜像文件,你需要就从仓库里去获取。
四、配置镜像加速器
直接在控制台输入下列代码,配置阿里云镜像加速器
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ptosxb5q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
五、Docker命令
Docker服务相关命令
bash
# 启动docker命令
systemctl start docker
# 停止docker命令
systemctl stop docker
# 查看docker服务状态
systemctl status docker
# 重启docker服务
systemctl restart docker
# 设置开机启动docker服务
systemctl enable docker
Docker镜像相关命令
bash
# 查看本地所有镜像
docker images
# 从网络中查找需要的镜像
docker search 镜像名称
# 从镜像仓库拉取镜像到本地
docker pull 镜像名称:TAG
# 删除镜像
docker rmi 镜像名称
其中TAG的版本可以从docker hub找
Docker容器相关命令
bash
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 创建并启动容器
docker run 参数
参数说明:
- -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器,退出容器后,容器自动关闭
- -t:为容器重新分配一个伪输入终端。
- -d:以守护(后台)模式运行容器。
- --name:为创建的容器命名
# 进入容器
docker exec 参数 # 退出容器,容器不会关闭
# 停止容器
docker stop 容器名称
# 启动容器
docker start 容器名称
# 删除容器
docker rm 容器名称
# 查看容器信息
docker inspect 容器名称
六、Docker容器数据卷
数据卷的概念及作用
数据卷的概念:
-
数据卷是宿主机中的一个目录或文件
-
当容器目录和数据卷目录绑定后,对方的修改会立即同步
-
一个数据卷可以被多个容器同时挂载
-
一个容器也可以被挂在多个数据卷
数据卷的作用
-
容器数据持久化
-
外部机器和容器间接通信
-
容器之间数据交换
配置数据卷
bash
# 创建启动容器时,使用 -v参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
注意事项
1. 目录必须是绝对路径
2. 如果目录不存在,则会自动创建
3. 可以挂在多个数据卷
七、Dockerfile
Docker镜像原理
-
Docker镜像是由特殊的文件系统叠加而成
-
最底层是bootfs,并使用宿主机的bootfs
-
第二层是root文件系统rootfs,称为base image
-
然后再往上可以叠加其它的镜像文件
-
一个镜像可以放在另一个镜像上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
-
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
思考题
- Docker镜像的本质是什么?
是一个分层文件系统
- Docker中一个Centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其它镜像层
- Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70MB呢?
由于Docker中镜像是分层的,tomcat虽然只有70多MB,但它需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小有500MB
容器转为镜像
第一种方式
bash
# 将改变过的容器打成一个镜像
docker commit 容器id 镜像名称:版本号
# 将整个镜像打成tar包,可传输
docker save -o 压缩文件名称 镜像名称:版本号
# 到了另外的机子,将这个tar包加载成镜像
docker load -i 压缩文件名称
第二种方式
使用Dockerfile构建
-
Dockerfile是一个文本文件
-
包含了一条条的指令
-
每一条指令构建一层,基于基础镜像,最终构建处一个新的镜像
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
Dockerfile打包springboot项目
需求
定义dockerfile,发布springboot项目
实现步骤
-
定义父镜像:FROM java:8
-
定义作者信息:MAINTAINER xxx<xxx@xxx.cn>
-
将打包好的springboot的jar包添加到容器中:ADD xxx.jar
-
定义容器启动执行的命令:CMD java -jar xxx.jar
-
通过dockerfile构建镜像:docker build -dockerfile 文件路径 -t 镜像名称:版本
示例:
bash
# touch /home/springboot_dockerfile
FROM JAVA:8
MAINTAINER li<li@li.com>
ADD springboot.jar app.jar
CMD java -jar app.jar
# 转为镜像
docker build -f dockerfile /home/springboot_dockerfile app:1.0
# 启动,注意,如果soringboot项目有端口映射要主要映射出端口
docker run -id -p 8080:8080 app
Dockerfile自定义centos
需求
自定义centos镜像,要求:
-
默认登录路径为/usr
-
可以使用vim
实现步骤
bash
# touch /home/my_centos7_dockerfile
FROM centos:7
MAINTAINER li<li@li.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
# 转为镜像
docker build -f dockerfile /home/my_centos7_dockerfile my_centos:1.0
# 启动
docker run -it --name=mycnetos7 my_centos:1.0
八、Dcoker compose
概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
-
利用 Dockerfile定义运行环境镜像
-
使用 docker-compose.yml 定义组成应用的各服务
-
运行 docker-compose up 启动应用
Docker compose安装使用
安装docker compose
bash
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
卸载docker compose
bash
rm /usr/local/bin/docker-compose
使用docker compose 编排nginx+springboot项目
bash
# 1. 创建项目目录
mkdir -p /home/dockerCompose
# 2. 创建Nginx配置文件, touch nginx.conf
events {}
http {
server {
listen 80;
location / {
proxy_pass http://springboot:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
# 3. 创建Dockerfile,touch myapp_dockerfile
FROM openjdk:8-jdk-alpine
COPY target/myapp.jar /app/myapp.jar
WORKDIR /app
CMD ["java", "-jar", "myapp.jar"]
4. 创建docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
springboot:
build:
context: .
dockerfile: myapp_dockerfile
ports:
- 8080:8080
volumes:
- ./target:/app
5. 构建和启动项目
docker-compose up --build