Docker
docker的安装
- 卸载旧版Docker
powershell
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest logrotate \
docker-engine
- 配置docker的yum库
powershell
yum install -y yum-utils
然后配置Docker的yum源
powershell
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- Docker安装成功,然后通过命令检测是否安装成功
powershell
docker -v(查看docker版本)
docker images
- 启动Docker
powershell
systemctl start docker
systemctl stop docker(停止docker)
systemctl restart docker(重启docker)
systemctl enable docker(开机自动启动docker)
- 然后在阿里容器镜像服务这边配置镜像加速(那边有教程)
docker的使用
docker部署mysql
命令:
powershell
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123\
mysql
然后就可以使用sqlyog连接到这点虚拟机ip上的mysql了。
利用docker安装应用时,Docker会自动搜索并下镜像,镜像不仅包含应用本身,还包含了运行所需的环境、配置等等,Docker会在运行时创建一个隔离环境,成为容器。
所以,可以在docker上搭建集群(这里搭建mysql集群)
使用 docker ps 命令可以查看已经启动的服务有哪些
镜像仓库:存储和管理镜像的平台Docker官方维护了一个公共的仓库:Docker Hub
命令解读
docker run
,创建并运行一个容器, -d是让容器在后台运行。
--name mysql
,给容器起个名字,唯一。
-p 3306:3306
,设置端口映射,把宿主机的端口和容器的3306端口做一个映射,当我们访问外部机器的3306端口时,docker会把请求转为容器内的3306端口。(前面是宿主机端口,后面是容器端口)
-e KEY=VALUE
,设置环境变量
mysql
,指定运行"镜像名字"- 镜像命名规范
镜像名称一般由两部分组成,镜像名:版本,mysql:5.7
如果没有指定版本,则是最新版本。
docker基础
常见命令
-
docker pull nginx
(拉取nginx镜像) -
docker images
(查看本地镜像列表) -
docker save -o nginx.tar nginxs:latest
(将本地的nginx镜像打包,:latest是版本,-o后面的名字是打包后的文件名) -
ll
(查看目录,会多出nginx.tar包) -
docker rmi nginx
(删除nginx镜像) -
docker load -i nginx.tar
(-i后面跟本地文件名,加载nginx.tar镜像,然后跟docker images查看,nginx镜像就回来了) -
docker -run -d --name nginx -p 80:80 nginx
(docker -run 创建并启动容器,-d代表后台运行,--name起名字,-p 80:80端口映射 -e是环境变量,没有就不用写,最后加上镜像名称,然后回车) -
docker -ps
(查看容器状态,其中输出的关键字如下,CONTAINER ID容器ID,
IMAGE容器所使用的镜像,
COMMAD内部运行时的启动命令,
CREATED创建时间,
STATUS状态,
up就是启动中,
PORTS端口映射)
-
docker stop nginx
(停止nginx容器,然后再用docker -ps查看,会发现nginx没了,所以docker -ps是查看运行中的容器) -
docker ps -a
(查看所有的容器) -
docker start nginx
(再启动nginx容器) -
docker logs nginx
(查看nginx的运行日志) -
docker logs -f nginx
(持续查看nginx日志,ctrl+c停止) -
docker exec -it nginx bash
(进入nginx容器,-it就是加上一个可执行命令的终端,bash是命令行交互方式) -
exit
(退出) -
docker stop nginx
(停止nginx容器) -
docker rm nginx
(删除nginx容器) -
docker rm nginx -f
(强制删除nginx(运行中的容器也可以删掉))
数据卷挂载
- 想要修改nginx容器内html目录下的index.html文件很困难,因为要进入到nginx的html目录下面,并进行vi操作,修改。但是会操作失败,因为docker只支持容器创建、运行的命令,不支持修改的命令。
数据卷,是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 - 创建一个数据卷(虚拟的东西),使用命令创建两个数据卷,为html和conf,然后docker会给这两个数据卷创建对应、真实的目录,在宿主机(虚拟机)。
- 在
/var/lib/docker/volumes/html
和/var/lib/docker/volumes/conf
创建数据卷对应的目录。 - 然后让容器的conf和html目录与数据卷进行"挂载"。
- 关联以后,docker会实现宿主机目录与容器内目录的双向绑定,双向映射。
- 命令
docker volume --help
查看数据卷命令
docker rem -f nginx
(先删除nginx容器)
docker run -d --name nginx -p 80:80 -v html:/user/shar/nginx/html nginx
(-v html:/user/shar/nginx/html,创建html数据卷,与容器内/user/shar/nginx/html这个文件进行挂载)
docker volume ls
(查看数据卷是否创建成功)
docker volume inspect html
(展示数据卷的详情信息)
cd /var/lib/docker/volumes/html
(进入虚拟机这个目录)
cat index.html
(查看文件内容,和我们的nginx内的html对应)
然后就可以修改了。
本地目录挂载
- 先查看数据卷是否存在(查容器详情)
docker inspect nginx
其中,Mounst字段包含的信息就是挂载的信息。容器在创建时会自己生成一个数据卷,成为匿名卷
但是在系统升级的时候,需要删除旧版本,然后安装新版本,但是匿名卷不会,所以定义容器的时候一定要定义数据卷。 - 执行
docker run
命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载,
本地目录必须以"/"或"./"开头,否则会被系统识别为数据卷而非本地目录。 - 然后去docker hub官方网页,找到mysql的数据目录、配置文件、初始化脚本的挂载(容器内的目录在官方文档里都有写)
a.挂载 /root/mysql/data 到容器内的 /var/lib/mysql 目录
b.挂载 /root/mysql/init 到容器内的 /docker-entrypoint-initdb.d 目录
c.挂载 /root/mysql/conf 到容器内的 /etc/mysql/conf.d 目录 - 命令
首先创建mysql-data、init、conf目录
yaml
mkdir mysql
cd mysql
mkdir data
mkdir init
mkdir conf
然后创建mysql容器并实现挂载
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123\
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
网络
- 默认情况下,所有容器都以bridge 方式连接到Docker 的一个虚拟网桥上,
在安装docker的那一刻,docker就会在虚拟机里建一张虚拟网卡,这个网卡的名字默认叫docker0,并且还会根据网卡创建一个虚拟的网桥。
它的地址是172.17.0.1/16 ,"/16"是这个ip地址的前16位是不能动的,一段的最大值是255,所以也就是172.17是不能动的。
当我们安装了第一个容器时,它就会以桥接的方式与跟网桥建立连接,因此,不同容器之间是根据网桥建立连接,他们之间是可以相互访问的。 - 通过
ip addr
可以看到虚拟机的网卡 - 自定义网络
加入了自定义的网络,也可以通过容器名相互访问,这样做的目的是重启某个容器,它的ip可能会变。 - 命令
docker netword ls
(查看自定义网络)
docker netword create wang
(自定义一个名为"wang"的网络)
docker netword connect wang mysql
(mysql加入wang网络)
docker inspect mysql
(查看mysql容器,就多出了一个自定义网桥)
也可以在run容器的时候,连接到自定义网桥
--network wang
docker netword rm wang mysql
(删除mysql)
docker实战
部署java项目
- 首先,准备Dockerfile(docker镜像,网上有现成的,搜一个jdk环境直接用就行)
- 在本地idea对项目进行打包,拿到.jar文件,和dockerfile一起放进虚拟机中
docker build -t java1 .
(构建一个java1的镜像,最新版本)dis
查看,生成了java1镜像
yaml
docker run -d \
--name java \
-p8080:8080 \
--network wang \
java(java镜像名字)
docker logs -f java
(查看镜像日志)
部署前端项目
- 创建一个新的容器,将conf与html进行挂载(在nginx.conf里配置了对目录的代理,要对地址进行修改)
- 上传准备好的前端项目和nginx.conf文件,然后对nginx.conf配置文件进行挂载
- 命令
yaml
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/user/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network wang \(与java项目共享网络)
nginx
dps
查看nginx与java都正常启动- 访问虚拟机地址:18080,可以正常访问页面。
DockerCompose
多容器操作,通过一个单独的docker-compose.yml模板文件,来定义一组相关联的应用容器,帮助我们来实现多个相互关联的Docker容器快速部署。