一、引言
1.1 环境不一致
1.2 隔离性
1.3 弹性伸缩
1.4 学习成本
二、Docker介绍
2.1 Docker的由来
Docker主要作者-所罗门 |
---|
![]() |
Docker的作者已经离开了维护Docker的团队 |
---|
![]() |
2.2 Docker的思想
2.3 Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
三、Docker安装
1如果已安装,可以先删除
# 列出已安装的docker包
[root@localhost taotie]# yum list installed|grep docker
# 如果有,就卸载
[root@localhost taotie]# yum -y remove docker-ce
2 安装yum-utils管理yum源
[root@localhost taotie]# yum install -y yum-utils
3 设置docker源
# 配置国内镜像速度快
[root@localhost taotie]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4 设置元数据缓存
[root@localhost taotie]# yum makecache fast
5 安装docker
# 安装指定版本
yum install --setopt=obsoletes=0 docker-ce-18.03.0.ce-1.el7.centos docker-ce-selinux-18.03.0.ce-1.el7.centos.noarch
# 如果不指定版本,装最新版本
[root@localhost taotie]# yum -y install docker-ce
# 如果最新版本安装失败,先执行如下两条命令,再安装最新版本
yum update -y nss curl libcurl
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6 启动docker
[root@localhost taotie]# systemctl start docker
7 验证
[root@localhost taotie]# docker run hello-world
8 设置镜像
拉取镜像时,需要通过镜像仓库,国外的仓库一般相对较慢,我们一般可以使用国内的镜像市场
国外 (已不能用)
https://hub.docker.com/
DaoCloud 国内(推荐、暂时能用)
https://hub.daocloud.io/
网易 需要注册(待考证)
https://c.163.com/hub#/m/home/
配置镜像:
[root@localhost taotie]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live"]
}
重启docker: [root@taotie ~]# systemctl restart docker
四、Docker命令
docker search
可以从https://hub.daocloud.io/查看相关镜像,并拉取
查找镜像
注意:name表示镜像名称,official表示是否官方镜像
docker images
查看已经拉取的镜像文件
docker pull
语法:docker pull 镜像名称:tag
拉取镜像,如果不指定tag值,拉取最新镜像
[root@localhost ~]# docker pull daocloud.io/library/tomcat:9.0.0.M21-jre8
docker run
创建并运行容器tomcat容器
docker run -d --name mytomcat -p 8888:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps -v /root/tomcat/logs:/usr/local/tomcat/logs daocloud.io/library/tomcat:9.0.0.M21-jre8
比如上面这个, 创建并启动tomcat容器
-d 让容器在后台运行
- -P 将容器内部使用的网络端口随机映射到主机端口
-p 指定绑定端口,比如: -p 8888:8080 ,是将容器内的端口8080映射到宿主机的8888端口上
- –name 创建容器时命名
- -v ,比如 :/a/b/c:/x/y/z 表示将宿主机中/a/b/c目录挂载到容器的/x/y/z目录,如果有多个目录需要挂载,指定多个-v
-v /root/tomcat/webapps:/usr/local/tomcat/webapps ,表示将宿主机的/root/tomcat/webapps映射到容器的/usr/local/tomcat/webapps目录
-v /root/tomcat/logs:/usr/local/tomcat/logs,表示将宿主机的/root/tomcat/logs映射到容器的/usr/local/tomcat/logs目录
测试
将测试网页所在的文件夹(一定要有文件夹,因为相当于是项目
),放入 /root/tomcat/webapps目录下
在宿主机通过 http://ip:8888/项目/ 的地址进行测试
docker ps
查看正在运行的容器
- -a 查看全部容器
- -f 根据条件过滤显示的内容(-f name=mytomcat)
- –format 指定返回值的模板文件(docker ps --format “{{.ID}}: {{.Ports}} {{.Image}}— {{.Status}}----”)
- -l 显示最近创建的容器
- -n 列出最近创建的n个容器
- -s 显示总的文件大小
docker ps –a 查看所有的容器,包括停止的容器
docker start
语法:docker start 容器名称/容器id
启动容器
docker stop
语法:docker stop 容器名称/id
停止容器
docker restart
语法:docker restart 容器名称/id
重启容器
docker exec
进入容器
docker exec -it mysql2 /bin/bash
再登录mysql: mysql -uroot -h127.0.0.1 -P3306 -p123456
-it表示以交互方式运行容器
docker cp
语法:
docker cp 宿主机文件 容器名:容器中目录 # 从宿主机拷贝到容器中
docker cp 容器名:容器中文件 宿主机目录 # 从容器中拷贝到宿主机
容器与主机之间的数据拷贝,可以将宿主机内容拷贝到容器,也可以将容器中内容拷贝到宿主机
docker rmi
语法:docker rmi 镜像名称:tag
imgageid 删除镜像,前提必须先删除相关容器
docker rm
语法:docker rm 容器名
根据容器名称删除容器
docker port
语法:docker port 容器名
查看容器的端口映射情况
docker inspect
语法:docker inspect 容器名
查看docker容器的详细信息
docker version
查看版本
五、拉取常用镜像并生成容器
项目部署相关的环境,如redis,mysql,nginx等
5.1 redis
拉取redis
docker pull daocloud.io/library/redis:5.0.7
创建容器并运行
docker run -p 6379:6379 --name myredis -v /root/redis/conf/redis.conf:/etc/redis/redis.conf -v /root/redis/data:/data -d daocloud.io/library/redis:5.0.7 redis-server /etc/redis/redis.conf
命令说明:
–name myredis : 指定容器名称
-p 6379:6379 : 端口映射,默认redis启动的是6379。
-v /root/redis/conf/redis.conf:/etc/redis/redis.conf : 将主机中指定目录下的redis.conf配置文件映射
-v /root/redis/data:/data : 将主机中指定目录下的data挂载到容器的/data
–redis-server 在容器执行redis-server启动命令
–appendonly yes :打开redis持久化配置
测试能否连上redis
docker exec -it myredis redis-cli
OK
5.2 mysql
拉取mysql
docker pull daocloud.io/library/mysql:5.7.30
创建容器并运行
docker run -d -p 3306:3306 -v /root/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 daocloud.io/library/mysql:5.7.30
-e:配置信息,此处配置mysql的root用户的登陆密码
-v /root/mysql/conf/my.cnf:/etc/my.cnf:映射配置文件
-v /root/mysql/data:/var/lib/mysql:映射数据目录
测试能否连接,可以使用linux的命令
先进入容器: docker exec -it mysql2 /bin/bash
再登录mysql: mysql -uroot -h127.0.0.1 -P3306 -p123456
OK
5.3 nginx
拉取nginx
docker pull daocloud.io/library/nginx:latest
创建容器
docker run -d --name mynginx -p 99:80 -v /root/docker_nginx/conf.d:/etc/nginx/conf.d -v /root/docker_nginx/dist:/usr/share/nginx/html daocloud.io/library/nginx:latest
配置前端页面的挂载目录 -v /root/docker_nginx/dist:/usr/share/nginx/html
在宿主机目录新建配置文件
在本地映射的数据卷的目录/root/docker_nginx/conf.d/下面创建一个新的配置文件default.conf
配置文件的内容如下:
# 这个是 /etc/nginx/conf.d/default.conf
server { # server 块是http 块中的 内容
listen 80; # nginx 默认监听的端口号
listen [::]:80;
server_name localhost; # ip
# location块
# root:将接收到的请求根据/usr/share/nginx/html去查找静态资源
# index: 默认去上述的路径中找到index.html或者index.htm
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# proxy_pass http://192.168.17.101:8088; # 设置代理路径,ip是linux系统所分配ip
}
#50x 错误页面跳转
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
重启: docker exec mynginx nginx -s reload
在windows系统中测试:http://ip:80
如果没有页面,可以在宿主机的/root/docker_nginx/dist中创建一个index.html页面,自己编写一个页面
<html>
<head>
<title>测试</title>
</head>
<body>
<h1>2024 test nginx</h1>
</body>
</html>
再试一次即可
六、docker-compose[了解]
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
。
6.1 下载 (老版本需要,现在最新版本不用下载)
注意:将docker-compose下载到/user/local/bin目录下
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
6.2 设置权限 (老版本需要,现在最新版本不用)
chmod 777 /usr/local/bin/docker-compose
6.3 测试docker-compose命令 (老版本需要,现在最新版本不用下载)
在任意目录,运行docker-compose命令
6.4 docker-compose的容器编排文件
文件名:docker-compose.yml
version: '3.1'
services:
mysql: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/redis:5.0.7 # 指定镜像路径
container_name: mysql2 # 指定容器名称
ports:
- 3306:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: 123456 # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- /root/docker_compose/mysql/data:/var/lib/mysql # 映射数据卷
tomcat:
restart: always
image: daocloud.io/library/tomcat:9.0.0.M21-jre8
container_name: mytomcat
ports:
- 8888:8080
environment:
TZ: Asia/Shanghai
volumes:
- /root/docker_compose/tomcat/webapps:/usr/local/tomcat/webapps
- /root/docker_compose/tomcat/logs:/usr/local/tomcat/logs
redis:
restart: always
image: daocloud.io/library/redis:5.0.7
container_name: myredis
ports:
- 6379:6379
environment:
TZ: Asia/Shanghai
volumes:
- /root/docker_compose/redis/conf/redis.conf:/etc/redis/redis.conf
- /root/docker_compose/redis/data:/data
注意:比如docker-compose.yml处于/root目录下,默认会创建一个名字是 root_default的网络,容器默认都会加入这个网络中,不同的容器间,通过服务名+容器的端口号进行通信。
比如,如下数据库的连接url,mysql:3306,其中mysql是在文件中配置的服务名
jdbc:mysql://mysql:3306/video2214?serverTimezone=Asia/Shanghai&useSSL=false
6.5 相关命令
# 基于docker-compose.yml启动被管理的容器(如果没有镜像,会直接拉取镜像并创建容器)
docker compose up -d
# 查看由docker-compose管理的容器
docker compose ps
# 开启|关闭|重启已经存在的由docker-compose维护的容器
docker compose start|stop|restart
docker compose down
关闭并删除容器
。
比如,如下数据库的连接url,mysql:3306,其中mysql是在文件中配置的服务名
jdbc:mysql://mysql:3306/video2214?serverTimezone=Asia/Shanghai&useSSL=false
6.5 相关命令
# 基于docker-compose.yml启动被管理的容器(如果没有镜像,会直接拉取镜像并创建容器)
docker compose up -d
# 查看由docker-compose管理的容器
docker compose ps
# 开启|关闭|重启已经存在的由docker-compose维护的容器
docker compose start|stop|restart
docker compose down
关闭并删除容器