这里是引用
Docker
文章目录
一、Docker 是什么
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
二、Docker 解决了什么
2.1环境不一致
本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。
2.2隔离性
哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。
2.3弹性伸缩
淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。
三、云计算和虚拟化 和 容器化
特性 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | Hypervisor | CGroups |
系统资源 | 5~15% | 0~5% |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB-TB | KB-MB |
集群规模 | 上百 | 上万 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
四、安装docker
切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker.
4.1下载Docker依赖的环境
旧版本的 Docker 称为 docker 或者 docker-engine,可使用以下命令卸载旧版本:(没有则忽略)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖IDK一样(yum install -y yum-utils)
4.2指定Docker镜像源
默认下载Docker会去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
其他参考执行(这里不要执行)
# 更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存
# 这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum makecache fast
# yum 会把下载的软件包和header存储在cache中而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令清除缓存
yum clean
# 单独安装指令
yum -y install docker-ce
# 显示 Docker 系统信息,包括镜像和容器数。
docker info
4.4Docker配置阿里云镜像加速
访问 https://help.aliyun.com/document_detail/60750.html.
进入控制台
找到镜像加速器
执行指令
修改docker镜像源
vim /etc/docker/daemon.json
如报错看下是否有启动docker service
[root@base ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)
Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
[root@base ~]# systemctl daemon-reload
[root@base ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@base ~]# service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2021-12-22 16:49:50 CST; 9s ago
Docs: https://docs.docker.com
Main PID: 8634 (dockerd)
Tasks: 9
Memory: 36.7M
CGroup: /system.slice/docker.service
└─8634 /usr/bin/dockerd -H fd:// --containerd=/run/cont...
12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.6...r
12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.6..."
12月 22 16:49:49 base dockerd[8634]: time="2021-12-22T16:49:49.7..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.0..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1...2
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.1..."
12月 22 16:49:50 base systemd[1]: Started Docker Application Con....
12月 22 16:49:50 base dockerd[8634]: time="2021-12-22T16:49:50.2..."
Hint: Some lines were ellipsized, use -l to show in full.
[root@base ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.12
Storage Driver: devicemapper
Pool Name: docker-253:0-33672984-pool
Pool Blocksize: 65.54kB
Base Device Size: 10.74GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data file: /dev/loop0
Metadata file: /dev/loop1
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 11.73MB
Data Space Total: 107.4GB
Data Space Available: 16.3GB
Metadata Space Used: 17.36MB
Metadata Space Total: 2.147GB
Metadata Space Available: 2.13GB
Thin Pool Minimum Free Space: 10.74GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.170-RHEL7 (2020-03-24)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.49.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.777GiB
Name: base
ID: DURT:ADTE:73X3:5MJD:PMCJ:VTAQ:ZLD7:QLAC:OE2O:I5OF:WTSH:6KHX
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
[root@base ~]# vim /etc/docker/daemon.json
添加如下内容,具体地址自己申请
重启服务
systemctl daemon-reload
systemctl restart docker
docker info
4.5Docker启动及设置开机自动启动
启动Docker服务
systemctl start docker
设置开机启动
systemctl enable docker
4.6 寻找镜像 mysql下载到本地 并且跑起来
执行命令
拉取mysql镜像
docker pull mysql:"指定版本"
运行一个mysql的docker容器
[root@base ~]# docker run --name "名字" -p "自己定义的端口":"映射的端口" -e MYSQL_ROOT_PASSWORD="MYSQL_ROOT_PASSWORD即root账户的密码" -d mysql:5.7
d7a8f3a4b1ae201a0a553494560d42b42039d1cd35e3d1868c165680d10d2464
--name="nginx-lb": 为容器指定一个名称;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-e username="ritchie": 设置环境变量;
MYSQL_ROOT_PASSWORD即root账户的密码。
-d: 后台运行容器,并返回容器ID;
mysql:5.7 镜像
查看是否运行成功
指令:
docker ps -a
五、镜像相关的指令
5.1 拉取镜像
docker pull 镜像名称[:tag]
# 举例 :docker pull daocloud.io/library/tomcat:8.5.15-jre8
5.2 查看本地全部镜像
#查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小
docker images
5.3 删除本地镜像
#镜像会占用磁盘空间,可以手动删除,表示通过查看获取
docker rmi 镜像的标识
5.4 镜像的导入导出
# 如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名和版本都是null,需要手动修改
# 讲本地镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像的名称
docker tag 镜像id 新镜像名称:版本
5.5 搜索镜像
docker search "镜像名称"
六、容器相关指令
6.1 运行容器需要指定具体镜像,如果镜像不存在,会直接下载
# 简单运行
docker run 镜像的标识|镜像名称[:tag]
# 常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d: 后台运行容器,并返回容器ID;
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# --name="nginx-lb": 为容器指定一个名称;
# -e username="ritchie": 设置环境变量;
6.2 查看正在运行的容器
docker ps [-qa]
# -a :查看全部的容器,包括没有运行的
# -q:之查看容器标识
6.3 查看容器日志
# 查看容器日志,以查看容器运行的信息
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
6.4 进入容器内部
# 可以进入容器内部进行操作
docker exec -it 容器id bash
6.5 复制内容到容器
# 将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径
6.6 重启&启动&停止&删除容器
# 重新启动容器
docker restart 容器id
# 启动停止运行的容器id
docker start 容器id
# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
七、数据卷
7.1 什么是数据卷
数据卷:将宿主机的一个目录映射到容器的一个目录中。
可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着起改变。
7.2 创建数据卷
创建数据卷之后,默认会存放再一个目录下/var/lib/docker/volumes/数据卷名称/_data
docker volume create 数据卷名称
7.3 查看数据卷详情
查看数据卷详情信息,可以查询到存放路径,创建时间等等。
docker volume inspect 数据卷名称
7.4 查看全部数据卷
docker volume ls
7.5 删除数据卷
docker volume rm 数据卷名称
7.6 容器映射数据卷
映射有两种方式:
通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。
# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id
# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id
7.7 案例
1: 创建mysql 镜像不带数据卷
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
2:连上 添加数据
3: 删除再创建容器 刷新数据库后发现数据已经没有了
[root@base ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddc6af90851d mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
[root@base ~]# docker rm -f dd
dd
[root@base ~]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
02d8ee5b48d9037ff22be4e77d4ff3f80a25cb239368ead631f01043fc6f4afc
4: 重新创建容器 带数据卷
4.1 创建新的数据卷
docker volume create mysqldata
4.2 创建容器带数据卷
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
4.3 做删除容器再回复的实验(这一次刷新之后发现还在)
具体Linux操作的步骤指令:
[root@base ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02d8ee5b48d9 mysql:5.7 "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
[root@base ~]# docker rm -f 02
02
[root@base ~]# docker volume create mysqldata
mysqldata
[root@base ~]# cd /var/lib/docker/volumes
[root@base volumes]# ls
02cefc2d2d72c82add15f798d7929405854c5c65359d5682b4c45838b180d45c backingFsBlockDev mysqldata
750246a20f6ab042c9a71ccd3bedddbffa0c3348537a7857a035dc2a13e0c6d4 ef96b79bf04e5e35e4a02001e3f9265495d81d94637cb080f6fd9625ddf6334a
7d3cbb86159bff710d2063a82a756a701c01775ee885fabb68358d246460ebb3 metadata.db
[root@base volumes]# cd mysqldata/
[root@base mysqldata]# ls
_data
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
24a2456a2048171737ad3f0a2d5cc4e23397c7f2df63142f778ddbeba954494c
[root@base mysqldata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24a2456a2048 mysql:5.7 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
[root@base mysqldata]# docker rm -f 24
24
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
66d2797cdf066d36e16197a4a0c9ceaa190dbf657352b481133dbc8d74dd2cee
#这里进入容器内部查看/var/lib/mysql
[root@base lib]# docker exec -it 66 bash
root@66d2797cdf06:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@66d2797cdf06:/# cd /var/lib/mysql
root@66d2797cdf06:/var/lib/mysql# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem test_volume
root@66d2797cdf06:/var/lib/mysql#
八、Docker Dockerfile
8.1 什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
我们可以从中央仓库下载一个镜像,也可以自己手动去制作—个镜像,需要通过Dockerfile去指定自定义镜像的信息
8.2 Dockerfile的基本语法
创建自定义镜像就需要创建一个Dockerfile,如下为Dockerfile的语言
from:指定当前自定义镜像依赖的坏境
copy:将相对路径下的内容复制到自定义镜像中workdir :声明镜像的默认工作目录
run:执行的命令,可以编写多个
cmd:需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)
例子:
#举个例子,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat: 8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
copy 与add
add 能完成copy的所有事情
-
add还能解压
-
add还能从url_拷贝文件到镜像
示例:
ADD http://example.com/ big.tar.xz /usr/src/things/
run cmd ENTRYPOINT
RUN命令执行命令并创建新的镜像层,通常用于安装软件包
CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行docker run时指定了其他命令)
env 环境变量设置
expose 容器暴露端口8.3 通过Dockerfile创建镜像
编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看到指定的镜像信息,注意最后的
docker bui1d -t 镜像名称[:tag] .
8.4 举例
创建Dockerfile
FROM openjdk:8-jre--我要创建的镜像 继承jdk8的镜像 ENV HOME /home run mkdir HOME--在镜像中执行命令 COPY ./my. jar HOME/my. jar--把宿主机中的文件copy 到容器中 WORKDIR HOME--workdir定义容器的工作目录 EXPOSE 8090 ENTRYPOINT [" java", " -jar", "my.jar"]--容器一启动马上执行的命令
创建镜像
docker build -t myhub:1.0 . # docker build 要在和dockerfile 同一路径下执行
根据镜像创建容器
docker run -p 8080:8090 -d myhub:1.0
** 创建dockerfile 有参数的** 运行容器的时候 指定环境参数
FROM openjdk:8-jre ENV HOME /home ENV profile dev run mkdir HOME COPY ./my.jar HOME/my.jar WORKDIR HOME ENTRYPOINT java -jar my.jar --spring.profiles.active=$profile
创建镜像
docker build -t myhub1:1.0 .
运行的时候传参数
docker run -p 8081:8091 -e profile=prod -d myhub1:1.0
九、maven docker 插件(原理,具体操作在CICD中)
9.1 把工程 自动达成镜像
- 执行mvn clean package -Dmaven.test.skip=true
- 把jar copy 到dockerfile 同一文件夹下面
- 自己写dockerfile
- 创建镜像
9.1 自动的把镜像上传到私服
- 创建Dockerfile 放在 Resouces 下
Dockerfile举例
FROM openjdk:8-jre
ENV ARTIFACTID dbtest
ENV ARTIFACTVERSION 1.0-SNAPSHOT
ENV HOME_PATH /home
WORKDIR $HOME_PATH
ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jar
ENTRYPOINT ["java", "-jar", "dbtest.jar"]
加入 docker 插件(新写一个docker.xml原先依赖需要同步在加上 docker 插件)
<!--docker 插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--docker镜像相关的配置信息1-->
<configuration>
<!--镜像名,这里用工程名-->
<imageName>${project.artifactId}</imageName>
<!--Dockerfile文件所在目录-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--TAG,这里用工程版本号-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--构建镜像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}-${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
9.3 上传代码到git
git add .--本地
git commit -m""
git push orgin master--推送到远程仓库
9.4 开发服务器 拉取最新代码
git pull origin master
9.5 打包 并且打成镜像
mvn clean package -Dmaven.test.skip=true -f pom_docker.xml docker:build
9.6 通过镜像运行容器
docker run -d -p 8090:8090 --name dbtest01 dbtest:1.0-SNAPSHOT
完整测试步骤
启动docker
systemctl start docker
关闭docker
systemctl stop docker
查看docker的运行状态
systemctl status docker
首先在idea中将项目打一个jar包
然后将该jar包放到服务器的某个目录下
创建dockFile目录,将该jar包放到该目录下
创建DockerFile文件
vi DockerFile
内容写:
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER yoyo
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中
ADD test_demo2-0.0.1-SNAPSHOT.jar /test_demo2-0.0.1-SNAPSHOT.jar
# 运行jar包
RUN bash -c 'touch /test_demo2-0.0.1-SNAPSHOT.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/test_demo2-0.0.1-SNA
PSHOT.jar"]
在dockerFile目录下,用docker命令打包镜像:
其中testjar表示打包好以后的镜像名称
docker build -f DockerFile -t testjar.
查看testjar镜像是否打包好:
docker images
运行镜像并产生容器,命令如下:
将主机的9999
端口映射到容器里8080
端口
docker run -it -v /usr/local/dockerFile/test_demo2-0.0.1
-SNAPSHOT.jar:/test_demo2-0.0.1-SNAPSHOT.jar -p 9999:8080 --privileged=true testjar /bin/bash
启动成功
如果想要在后台运行该项目,可以将启动命令改成:
docker run -dit -v /usr/local/dockerFile/test_demo2-0.0.1
-SNAPSHOT.jar:/test_demo2-0.0.1-SNAPSHOT.jar -p 9999:8080 --privileged=true testjar /bin/bash
### 在dockerFile目录下,用docker命令打包镜像:
其中testjar表示打包好以后的镜像名称
```java
docker build -f DockerFile -t testjar.
查看testjar镜像是否打包好:
docker images
运行镜像并产生容器,命令如下:
将主机的9999
端口映射到容器里8080
端口
docker run -it -v /usr/local/dockerFile/test_demo2-0.0.1
-SNAPSHOT.jar:/test_demo2-0.0.1-SNAPSHOT.jar -p 9999:8080 --privileged=true testjar /bin/bash
启动成功
[外链图片转存中…(img-EziXAq7X-1699342832688)]
如果想要在后台运行该项目,可以将启动命令改成:
docker run -dit -v /usr/local/dockerFile/test_demo2-0.0.1
-SNAPSHOT.jar:/test_demo2-0.0.1-SNAPSHOT.jar -p 9999:8080 --privileged=true testjar /bin/bash