1.为什么使用docker
如果开发环境和测试环境的允许软件版本不一致,可能会导致项目无法正常启动
把环境和项目一起打包发送给测试环境
1.1docker的概念
开源的应用容器引擎,完全使用沙箱机制,相互隔离,容器性能开销极低
一种容器技术,解决软件跨环境迁移的问题
1.2安装
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y ce社区版---学习够了, ee版企业版收费
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
上面无法安装可采取
# step 1: 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.3设置docker镜像地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOFsudo systemctl daemon-reload
sudo systemctl restart docker
2.常用命令
启动docker服务 systemctl start docker
停止docker服务 systemctl stop docker 重启docker服务 systemctl restart docker
查看docker服务状态 systemctl status docker
开机启动dockeh服务 systemctl enable docker
查看docker命令帮助文档: docker 具体命令 --help
2.2镜像命令
查看本地镜像: docker images
搜索镜像 远程仓库的 docker search redis
拉取镜像 docker pull redis:6.0 冒号后跟的是版本号,如果不跟默认latest
根据id删除
docker rmi id
根据名称:版本号删除
docker rmi redis:6.0
-------------------------------------------------------
删除没有开启容器的镜像
删除所有镜像
docker images q --查询所有镜像的id
docker rmi (docker images q)
2.3容器命令
1.创建容器
-i :交互
-t:给容器分配伪终端接受命令 如果使用exit则退出容器,容器会被关闭
--name:给容器起名字
redis:latest:镜像加版本号
/bin/bash 进入容器的初始化指令 这里相当打开了一个shell窗口
2.查看容器
docker ps --查看正在运行的容器
docker ps -a --查看所有容器
3.创建一个容器但不进入容器
docker run -id --name=c_redis02 redis:latest /bin/bash
这种创建的容器退出后不会自动关闭
4.进入正在运行的指定容器内
docker exec -it c_redis02 /bin/bash
5.启动容器
docker start 容器名|id
6.关闭容器
docker stop 容器名
7.删除容器
docker rm 容器id #只删除未启动的容器
docker rm -f 容器id||名称 #删除任何容器
docker ps -aq #查看所有容器的id
查看容器信息 docker inspect 容器名|id
输出当前容器日志信息---知道容器启动失败的原因 docker logs 容器id
3.Docker容器卷
1.容器被删除后,里面的数据不会存在
2.外界不能与容器直接交互,可以与宿主机交互,宿主机与容器交互
3.容器与容器之间可以共享文件
3.1数据卷的概念
数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定后对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
作用:
1.解决数据持久化问题
2.解决外部机器和容器的间接通讯问题
3.解决容器之间的数据交换
3.2创建数据卷
docker run -id --name=容器名 -v /宿主机目录:/容器中的目录 镜像名:版本号 /bin/bash
-v :挂载数据卷
docker run -id --name=c1 -v /aaa:/c_aaa redis:latest /bin/bash
4.Docker应用部署
4.1 Docker部署mysql
1. 拉取mysql镜像---docker pull mysql:8.0
2. 创建一个mysql目录。mkdir/root/mysql
3. 进入/root/mysql
4. 创建mysql容器。
docker run -d --name=mysql01 -p 3307:3306 -v /usr/docker/mysql/log:/var/log/mysql \
-v /usr/docker/mysql/data:/var/lib/mysql -v /usr/docker/mysql/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
介绍参\数:
-p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
-v /ykq/mysql/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
-v /ykq/mysql/log:/var/log/mysql:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
-v /ykq/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
4.2安装tomcat
docker pull tomcat
创建容器,设置端口映射、目录映射
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat --restart=always \
-p 8089:8080 \
-e TZ=Asia/Shanghai \
-v /usr/docker/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:10
4.3部署nginx
拉取镜像docker pull nginx
创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir /usr/docker/nginx
cd /usr/docker/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
docker run -p 80:80 \
-d --name=nginx \
-v /usr/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/docker/nginx/html:/usr/share/nginx/html \
nginx:latest
4.4redis部署
docker pull redis
docker run -id --name=redis01 -p 6379:6379 redis:latest
5.自定义镜像
5.1 镜像制作
自定义镜像:提供了两种方式: 第一种:基于容器来制作 第二种: 通过dockerfile文件来制作[重要]
操作系统组成部分:
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统
1. Docker镜像本质是什么?
·是一个分层文件系统
2. Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
·Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
3. Docker中一个tomcat镜像为什么有500MB,而一个tomcat按装包只有70多MB?
·由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
拉jdk
docker pull openjdk:8
创建镜像
docker commit bb016ec9269e aaa_tomcat:1.0
打包镜像
docker save -o aaa_tomcat.tar aaa_tomcat:1.0
删除镜像docker rmi aaa_tomcat:1.0
解压打包的镜像docker load -i aaa_tomcat.tar
创建容器 docker run -it --name=aaa_tomcat aaa_tomcat:1.0 /bin/bash
重新运行自定义的镜像,挂载文件会失效,其他目录下的文件还会存在
5.3dockerfile的概念[重要]
-
Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作。MySQL redis tomcat等 项目
-
文件包含了一条条的指令。
-
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
-
对于运维人员:在部署时,可以实现应用的无缝跨平台移植。
5.3.1Dockerfile关键字
案例1
准备
docker pull centos:7
docker run -id --name=centos7 centos:7
docker exec -it centos7 /bin/bash 容器中vim不可用
文件里面的内容
FROM centos:7
MAINTAINER xxx <xxx@qq.com>
RUN yum install -y vim
WORKDIR /usr
CMD ["/bin/bash"]————————————————————————上面不能用的话使用下面的
FROM centos:7
MAINTAINER xxx<xxxx@qq.com>
ENV MYPATH /usr
WORKDIR $MYPATH
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum makecache
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "============"
CMD /bin/bash
构建镜像
docker build -f centos_dockerfile -t abc_centos:1.0 .
-f:表示dockerfile文件
-t: 镜像名称版本号
. (点): 必须加上
创建容器vim可用
案例2
将打包好的jar文件拖进去,并创建
FROM openjdk:17
MAINTAINER xxx <xxxx@qq.com>
ADD demo05.jar app.jar
CMD java -jar app.jar
根据dockerfile制作镜像
docker build -f demo_dockerfile -t app:1.0 .
启动并做端口映射
docker run -id --name=app05 -p 9001:8080 app:1.0
6.Docker服务编排
6.1 概述
docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?[微服务100---dockerfile----镜像---运行为容器]
如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具.--服务编排
Compose允许用户通过一个单独的docker-compose.yml模板文件[你写](YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
6.2 Docker Compose 安装使用
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
#curl -L https://mirrors.tuna.tsinghua.edu.cn/docker-compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息docker compose version
springboot+nginx编排
1.创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
2.打包springboot工程
3编写 docker-compose.yml 文件
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app05
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app05:
image: app:1.0
expose:
- "8080"
version: "3.9"
4.mkdir -p nginx/conf.d
在里面加一个ngin.conf文件
server {
listen 80;
access_log off;location / {
proxy_pass http://app05:8080;
}
}
5.启动容器
docker compose up
6.3创建私有仓库
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
"insecure-registries":["ip:5000"]
# 5、重启docker 服务
systemctl restart docker
docker start registry
输入 http://ip:5000/v2/_catalog
6.3.1上传到私有仓库
# 1、标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
6.3.2拉取
docker pull 私有仓库服务器ip:5000/centos:7