Docker
Docker安装
1、卸载旧的
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装必备的环境
sudo yum install -y yum-utils
3、设置镜像仓库的地址
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #是国外的,很慢,不要用
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云的
4、更新yum软件包的索引
yum makecache fast
5、安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
6、启动docker
systemctl start docker
7、下载hello-world镜像并启动容器
docker run hello-world
8、卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
9、配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
.
Docker服务
-
systemctl start docker:开启docker。
-
systemctl stop docker:关闭docker。
-
systemctl enable docker:将docker服务设为开机启动。
-
docker version:查看docker版本号。
-
docker info:也是查看信息的。
-
docker –help:可以查看docker的命令。
.
Docker镜像
-
docker search mysql:查询mysql镜像。
-
docker rmi -f + 镜像id/镜像名字:版本号:强制删除镜像。
-
docker rmi -f 镜像1的id 镜像2的id:删除多个镜像。
-
docker rmi -f $(docker images -aq):删除所有镜像。
-
docker pull mysql:5.7.32 下载5.7.32版本的mysql。
-
docker images:查看所有下载好的镜像。
- -a:列出本地所有镜像
- -q:只列出镜像ID
- –digests:显示镜像的摘要信息
- –no-trunc:显示完整的镜像信息
-
whereis logstash:查看logstash在哪。
-
docker tag:给镜像打标签,相当于把该镜像复制一份改一个名字。
#比如现在有一个centos镜像
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
#我对于centos进行了开发,开发了一个版本,我就可以对这个版本进行打标签,打完标签就会生成新的镜像
#格式为:docker tag from_image new_image:版本号
[root@localhost ~]$ docker tag centos centos:v1
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
centos v1 1e1148e4cc2c 2 weeks ago 202MB
.
Docker容器
-
docker ps:查看运行中的容器。
- -a:查看所有的容器。
- -n:查看最近n次创建的容器。
- -q:只显示容器ID。
-
docker stop +容器id/容器名:关闭容器。
-
docker start +容器id/容器名:开启容器。
-
docker restart +容器id/容器名:重启容器。
-
docker kill +容器id/容器名:强制关闭容器。
-
docker rm +容器id:删除容器。
-
docker rm -f +容器id:强制删除容器。
-
docker rm -f $(docker ps -aq):删除所有容器。
-
docker update +容器名/id - -restart=always:设置容器自动重启。
-
docker logs -f +容器id --tail=1000:只显示最后1000行的日志信息。
-
docker attach + 容器id/容器名 /bin/bash。
-
docker exec -it + 容器id/容器名 /bin/bash。
-
docker top +容器id/容器名(查看容器的进程)。
-
docker inspect +容器id(查看容器内部细节)。
-
docker cp +容器id: 容器文件路径 宿主机的路径==(把容器内部的文件拷贝到宿主机)==。
-
docker cp 宿主机文件路径 容器id: 容器内部路径==(把宿主机的文件复制到容器内部)==。
-
docker load -i tar文件名:将一个tar文件解压到docker仓库。
-
docker save 镜像名:tag号 -o 自定义tar文件名:将一个镜像打成tar包保存下来。
-
将容器打包成镜像:
docker commit -m "描述信息" -a "作者信息" 容器id 新的镜像名称:自定义标签
。
.
Dockerfile
Dockerfile概述
主要是通过docker build指令来建立一个自定义的docker镜像
- 当docker-client端执行docker build指令后,它会将
Dokerfile所在目录
作为下上文目录一次性打包发给docker-server端,如果有一些文件不想打包发送过去,只需要建立一个.dockerIgnore
文件忽略即可,docker-server端接收之后开始打包构建镜像。 - Dockerfile里的每一行指令都会使docker-server端生成一个镜像,存储在docker-cache中,方便下一次的读取效率;最终呈现给我们的则是最终镜像。
- 如果你不想使用上一次的镜像缓存,可以在docker build指令中加入
--no-cache
,这样每一次就会重新从头开始构建了。
Dockerfile常见指令
-
**FROM:**基础镜像,表示当前镜像是基于哪个父镜像。
-
**MAINTAINER:**镜像维护者的姓名与邮箱地址(已经废弃了)。
-
**RUN:**容器构建的时候需要执行的额外shell命令。
-
**EXPOSE:**当前容器对外暴露的端口号。
-
**WORKDIR:**表示容器启动之后终端默认登录进来的目录,也就是落脚点,不指定的话就代表根目录;WORKDIR可以有多个,如果有相对路径,那么该路径是与上一个WORKDIR指令的路径相对。
-
**ENV:**用来在构建镜像过程中设置环境变量。
ENV MY_PATH /user/mytest
WORKDIR $MY_PATH # 就表示我运行容器后的落脚点的目录是/user/mytest
-
**ADD:**就是将宿主机中的文件拷贝到镜像中;如果是压缩包,它会自行解压;还可以是URL地址。
-
**COPY:**跟ADD作用一样,但是不会自行解压压缩包,只是单纯的拷贝。
COPY/ADD ./market-service.jar /vcloud-market-springboot2.jar
-
**VOLUME:**允许docker内部文件可以被挂载出去,如果没有写,则是挂载不出去的。
-
**CMD:**指定一个容器启动时运行的命令,Dockerfile中可以有多个CMD命令,但只有最后一个命令生效,最后一个CMD命令会被docker run之后的参数替换掉。
比如:运行docker run -p 6666:8080 tomcat ls -l就不会创建这个Tomcat容器实例,它会实现ls -l这条命令,因为参数已经发生了替换
-
**ENTRYPOINT:**跟CMD作用一样,只不过docker run之后的参数不会被替换,而是会被
追加到命令之中
执行。CMD与ENTRYPOINT配合使用的时候,要写
json数组
的形式。ENTRYPOINT写固定的命令,CMD写常变化的命令。
-
**ONBUILD:**当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild就会被触发。
-
**USER:**设定哪个用户可以运行该dockerfile文件。
-
**.dockerignore:**忽略一些东西。
Dockerfile构建含有vim功能的centos7
FROM centos:7
RUN yum install -y vim
# 第二种方式:
["yum","install","-y","vim"]
Dockerfile构建含有Tomcat压缩包的centos7
From centos:7
RUN yum install -y vim
EXPOSE 5672
EXPOSE 15672
WORKDIR /zyh
WORKDIR bb #WORKDIR具有追加功能,是上一个路径下的相对路径;所以落脚点就是docker容器内部的/zyh/bb目录下
COPY ./a.txt /zyh/bb/b.txt # 使用相对路径
ADD https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.71/bin/apache-tomcat-8.5.71.tar.gz /zyh/bb #将tomcat压缩包下载到docker容器的/zyh/bb目录下
RUN tar -zxvf ./apache-tomcat-8.5.71.tar.gz
RUN mv apache-tomcat-8.5.71 tomcat
WORKDIR tomcat
VOLUME /zyh/bb/tomcat/webapps #允许docker容器内部的webapps目录被挂载出来
Dockerfile构建springboot应用
1、先创建一个springboot项目,设置8080端口号
2、建立Dockerfile文件
FROM openjdk:8-jre
WORKDIR /docker01
ADD docker_demo01-0.0.1-SNAPSHOT.jar demo01.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar"]
CMD ["demo01.jar"]
3、生成镜像,运行docker容器
docker build -t demo01:R4.3C01_01_c ./
docker run -d -p 8080:8080 --name demo demo01:R4.3C01_01_c #前一个8080表示外部的,后面的表示docker内部暴露出来的
浏览器访问xxx.xxx.xx.xx:8080/hello
.
Docker Compose
Docker Compose运行示例
比如一个web项目,除了web服务器本身,往往还需要加上mysql、redis、es、mq容器等,为了高效管理docker多个容器,将许多小的容器部署进去,共同组成一个project,一起启动。
1、下载compose
# 要放到/usr/local/bin下,这样我们就不用配置环境变量了
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、授予执行的权限
chmod +x /usr/local/bin/docker-compose
3、查看版本号
[root@xxx bin]# docker-compose -v
docker-compose version 1.25.5, build 8a1c60f6
4、docker-compose.yml文件
version: "3.0"
services:
tomcat01: #指定服务名唯一
container_name: tomcat01 #指定容器名,想当于run --name
image: tomcat:8.0-jre8 #创建当前服务使用的镜像是谁,想当于run image
ports:
- "8081:8080" #宿主机:容器内部,为了防止出错,最好用引号包起来,想当于run -p
volumes: #指定容器卷映射,想当于run -v
- tomcat01Volume:/usr/local/tomcat/webapps
networks: #指定用的网桥,想当于run --network
- vcloudnet01
tomcat02:
container_name: tomcat01
image: tomcat:8.0-jre8
ports:
- "8082:8080"
volumes:
- tomcat02Volume:/usr/local/tomcat/webapps
networks:
- vcloudnet01
mysql:
container_name: mysql01
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqlLog:/var/log/mysql
- mysqlData:/var/lib/mysql
- mysqlConf:/etc/mysql
networks:
- vcloudnet01
environment: #设置环境变量
- MYSQL_ROOT_PASSWORD=123456
networks: #定义上面服务用到的网桥,可以写多个
vcloudnet01:
vcloudnet02:
volumes: #定义上面服务所需要的挂载出去的数据卷名,可以写多个
tomcat01Volume:
tomcat02Volume:
mysqlLog:
mysqlData:
mysqlConf:
5、在docker-compose同级目录下执行docker-compose up -d即可,浏览器访问xxx.xx.xx.xx:8081或者8082都可以。
docker-compose.yaml文件配置
version
表示对应的docker是什么版本,一般3.0就行了。
build
相当于docker build
,指定Dockerfile文件生成镜像。
ports
相当于docker run -p
,指定暴露的端口号,宿主机:容器内部。
volumes
相当于docker run -v
,用于容器卷的挂载有,两种方式。
- 自定义指定:直接将绝对路径写上去。
version: "3.0"
services:
tomcat01: #指定服务名唯一
volumes:
- /zyh/docker01:/usr/local/tomcat/webapps
- 自动指定:它会在宿主机上给你自动分配一个地址,用于与容器内部文件进行挂载。
version: "3.0"
services:
tomcat01: #指定服务名唯一
volumes:
- tomcat01Volume:/usr/local/tomcat/webapps
volumes: #定义上面服务要挂载出去的数据卷名,可以写多个
tomcatVolume:
如何查看这个地址被分配到哪了?
#注意:卷名默认会加上该项目的名字(vcloudtest),然后用_进行拼接而成
[root@xxx vcloudtest]# docker volume ls
DRIVER VOLUME NAME
local docker-compose_tomcat01Volume
local docker-compose_tomcat02Volume
local vcloudtest_tomcat01Volume
local vcloudtest_tomcat02Volume
#使用docker inspect指令可以查看分配的地址在哪
[root@xxx ~]# docker inspect vcloudtest_tomcat01Volume
[
{
"CreatedAt": "2021-10-10T14:05:45+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "vcloudtest",
"com.docker.compose.version": "1.25.5",
"com.docker.compose.volume": "tomcat01Volume"
},
"Mountpoint": "/var/lib/docker/volumes/vcloudtest_tomcat01Volume/_data",
"Name": "vcloudtest_tomcat01Volume",
"Options": null,
"Scope": "local"
}
]
#文件地址就在/var/lib/docker/volumes/vcloudtest_tomcat01Volume/_data下
[root@xxx vcloudtest]# cd /var/lib/docker/volumes/vcloudtest_tomcat01Volume/_data
[root@xxx _data]# ls
docs examples host-manager manager ROOT
networks
相当于docker run --network
,用于指定使用哪个网桥。
version: "3.0"
services:
tomcat01: #服务名唯一
container_name: tomcat01
image: tomcat:8.0-jre8 #创建当前服务使用的镜像是谁
ports:
- "8081:8080"
networks:
- vcloudnet01
networks: #定义上面服务用到的网桥,可以写多个
vcloudnet01:
vcloudnet02:
如何查看指定的网桥名字?
#默认会加上项目名(vcloudtest),而后用_拼接而成
[root@xxx vcloudtest]# docker network ls
NETWORK ID NAME DRIVER SCOPE
938d7d8b689c bridge bridge local
74d586b7aa3d docker-compose_default bridge local
25a8cfc576d4 docker-compose_vcloudnet01 bridge local
63b49b5bfd90 host host local
09e53334b1d0 none null local
568f617b2843 vcloudtest_default bridge local
159181bd7772 vcloudtest_vcloudnet01 bridge local
environment
设置环境变量,例如MySQL启动需要指定root用户密码。
version: "3.0"
services:
mysql:
container_name: mysql01
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqlLog:/var/log/mysql
- mysqlData:/var/lib/mysql
- mysqlConf:/etc/mysql
networks:
- vcloudnet01
environment: #设置环境变量
- MYSQL_ROOT_PASSWORD=123456
env_file
用来替换environment参数,防止敏感信息被暴露。
version: "3.0"
services:
mysql:
container_name: mysql01
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqlLog:/var/log/mysql
- mysqlData:/var/lib/mysql
- mysqlConf:/etc/mysql
networks:
- vcloudnet01
env_file:
- ./mysql.env
mysql.env文件:
MYSQL_ROOT_PASSWORD=123456
在当前项目目录下新建mysql.env文件(必须以.env结尾的文件),将environment中要设置的环境变量以key-value的形式放到该文件中即可。
depends_on
配置该服务启动会依赖于哪些服务先行启动。
version: "3.0"
services:
tomcat01: #服务名唯一
container_name: tomcat01
image: tomcat:8.0-jre8 #创建当前服务使用的镜像是谁
ports:
- "8081:8080"
networks:
- vcloudnet01
depends_on: #配置该服务启动会依赖于哪些服务先行启动,注意下面的是服务名,而不是容器名
- tomcat02
- mysql
build
先利用Dockerfile文件生成镜像再使用该镜像。
version: "3.0"
services:
demo01: #服务名唯一
build: #先利用Dockerfile生成镜像而后再使用该镜像
context: ./docker01 #指定Dockerfile所在的上下文目录
container_name: demo01 #指定容器名
ports:
- "8080:8080"
networks:
- vcloudnet01
depends_on:
- tomcat01
docker-compose指令
- docker-compose up -d:后台启动yaml中定义的所有容器。
- docker-compose down:停止所有容器,并移除网络。
- docker-compose exec + 服务名:进入指定的容器。
- docker-compose ps:展示yaml文件中定义的所有容器信息。
- docker-compose restart + 服务名:重启指定的容器。
- docker-compose rm -f + 服务名:删除指定的容器。
- docker-compose top + 服务名:查看指定容器内运行的进程信息。
- docker-compose pause + 服务名:暂停指定容器。
- docker-compose unpause + 服务名:恢复指定容器。
- docker-compose logs -f + 服务名:查看指定容器的日志。
.
Doker安装Tomcat
使用docker创建的Tomcat容器只需要使用
curl localhost:8081
能够获取到HTML页面即可,宿主机使用浏览器访问不了也无所谓了,是端口映射的问题。
# 指定路径挂载(不推荐),由于宿主机下/zyh/tomcat里面什么都没有,它默认会将容器中的webapps目录下的数据清空,你是访问不了Tomcat首页的。
docker run -d -p 8080:8080 --name:tomcat01 -v /zyh/tomcat:/usr/local/tomcat/webapps tomcat:8.0-jre8
# 不指定路径挂在(推荐),它不但不会将容器中的webapps目录下的数据清空,而会将数据复制到/zyh/tomcat目录下,你是可以访问到首页的。
docker run -d -p 8080:8080 --name:tomcat02 -v tomcatVolume:/usr/local/tomcat/webapps tomcat:8.0-jre8
# tomcatVolume就是数据卷的名字,可以通过docker volume inspect来查看映射的路径在哪
[root@xxx vcloudtest]# docker volume inspect tomcatVolume
[
{
"CreatedAt": "2021-12-05T15:03:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/tomcatVolume/_data",
"Name": "tomcatVolume",
"Options": null,
"Scope": "local"
}
]