三、docker相关
三、docker相关
Docker 安装
3.1、使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用yum安装docker(推荐)
yum install -y docker
手动安装
- 卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装工具包
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 设置仓库
使用官方源地址(比较慢,不推荐)
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
清华大学源
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
如果提示您接受 GPG 密钥,请选是。
有多个 Docker 仓库吗?
如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。
Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1
。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
启动 Docker。
sudo systemctl start docker
通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
sudo docker run hello-world
卸载 docker
删除安装包:
yum remove docker-ce
删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker
常用命令
3.2、1. docker 基础命令
启动docker
systemctl start docker
关闭docker
systemctl stop docker
重启docker
systemctl restart docker
docker自启动
systemctl enable docker
查看docker 运行状态
------如果是在运行中 输入命令后 会看到绿色的active
systemctl status docker
查看docker 版本号信息
docker version
docker info
docker 帮助命令
忘记了某些命令便可使用此进行查看与回顾
docker --help
比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用
docker pull --help
2. docker 镜像命令
查看自己服务器中docker 镜像列表
docker images
搜索镜像
docker search 镜像名
# 搜索 STARS >9000的 mysql 镜像
docker search --filter=STARS=9000 mysql
拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名
# 指定版本
docker pull 镜像名:tag
拉取最新版 mysql
docker pull mysql
运行镜像
删除镜像
当前镜像没有被任何容器使用才可以删除
#删除一个
docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
强制删除镜像
docker image rm 镜像名称/镜像ID
镜像的基础命令就到这里 下方会使用更复杂的 docker run 命令 来根据镜像启动容器
保存镜像
将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
命令:
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
exmaple:
docker save tomcat -o /myimg.tar
加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
镜像标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG
# 如果省略TAG 则会为镜像默认打上latest TAG
docker tag aaa bbb
# 上方操作等于 docker tag aaa:latest bbb:test
ex:
# 我们根据镜像 quay.io/minio/minio 添加一个新的镜像 名为 aaa 标签Tag设置为1.2.3
docker tag quay.io/minio/minio:1.2.3 aaa:1.2.3
# 我们根据镜像 app-user:1.0.0 添加一个新的镜像 名为 app-user 标签Tag设置为alpha-1.0.0
docker tag app-user:1.0.0 app-user:alpha-1.0.0
3. docker 容器命令
查看正在运行容器列表
docker ps
查看所有容器
包含正在运行 和已停止的
docker ps -a
启动容器
docker start 容器ID/容器名
停止容器
docker stop 容器ID/容器名
重启容器
docker restart 容器ID/容器名
修改容器为自启动
docker update --restart=always 容器名
kill 容器
docker kill 容器ID/容器名
运行一个容器
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
例如我们要启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5
#1. 拉取redis 镜像
docker pull redis:5.0.5
#2.命令启动
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
查看端口使用情况
# netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息
netstat -untlp
删除容器
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
容器端口与服务器端口映射
命令:
-p 宿主机端口:容器端口
-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
进入容器方式
docker exec -it 容器名/容器ID /bin/bash
进入 前面的 redis001容器
docker exec -it redis001 /bin/bash
容器文件拷贝 —无论容器是否开启 都可以进行拷贝
#docker cp 源文件路径 目标文件路径
#从容器内 拷出
docker cp 容器ID/名称:容器内路径 容器外路径
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称:容器内路径
查看容器日志
docker logs -f --tail=要查看末尾多少行(默认all) 容器ID
查看redis日志的最后10行
docker logs -f --tail=10 redis
挂载到主机
命令:
-v 宿主机文件存储位置:容器内文件位置
如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件
-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
示例:
# 运行一个docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
更换容器名
docker rename 容器ID/容器名 新容器名
4. 自己提交一个镜像
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag
我们拉取一个tomcat镜像 并持久化运行 且设置与宿主机进行端口映射
docker pull tomcat
docker run -itd -p8080:8080 --name tom tomcat /bin/bash
使用 提交命令 将在运行的tomcat 容器 打包为一个全新的镜像 名字为tom Tag为1.0
docker commit -a="leilei" -m="第一次打包镜像" 231f2eae6896 tom:1.0
设置容器名字为lei 映射端口为6500:8080
docker run -d -it -p6500:8080 --name lei tom:1.0 /bin/bash

访问6500 端口进入到了 tomcat 首页 说明 咱commit 镜像成功了
5. docker 运维命令
可能有时候发布会遇到如下错误:
docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device
这个错误是docker在写入的时候报错无机器无空间
查看docker工作目录
sudo docker info | grep "Docker Root Dir"
查看docker磁盘占用总体情况
du -hs /var/lib/docker/
查看Docker的磁盘使用具体情况
docker system df
删除 无用的容器和 镜像
# 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
清除所有无容器使用的镜像
注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
docker system prune -a
查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
查找指定docker使用目录下大于指定大小文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'
ex:我这里是查找 /var/lib/docker/overlay2/* 开头的且大于100m的文件
6. 手动部署jar文件
目录结构:

Dockerfile
文件
# 基础镜像为centos
FROM centos:centos7
# 作者
MAINTAINER apzs
# 为Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录
WORKDIR /usr/local/mydata
# 添加jdk压缩包至 /usr/local 目录,压缩包会自动解压,解压后目录名称为jdk1.8.0_101 (如果不知道名字,可以在自己电脑上先把tar.gz这个文件解压,即可看到命名为 jdk1.8.0_101 )
ADD jdk-8u101-linux-x64.tar.gz /usr/local/env/jdk/
# 配置JAVA_HOME环境变量
ENV JAVA_HOME /usr/local/env/jdk/jdk1.8.0_101/
# 将JAVA_HOME/bin 添加至PATH环境变量
ENV PATH $JAVA_HOME/bin:$PATH
# 将这两个文件移动到指定目录
ADD librxtxSerial.so $JAVA_HOME/jre/lib/amd64
ADD RXTXcomm.jar $JAVA_HOME/jre/lib/ext
# 开放的端口
EXPOSE 8080
# VOLUME 指定了临时文件目录为/env/jdk/tmp
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/env/jdk/tmp
VOLUME /env/jdk/tmp
# 把本路径的sensor.jar复制到相对于相对于WORKDIR的位置(即/usr/local/mydata/sensor.jar)
COPY sensor.jar sensor.jar
# 容器启动时执行的命令(sensor.jar相对于WORKDIR,即/usr/local/mydata/sensor.jar)
ENTRYPOINT ["java","-jar","sensor.jar"]
# 安装vim
# RUN yum -y install vim
构建镜像命令(.
表示寻找当前目录的Dockerfile文件)
docker build -f ./Dockerfile -t sensorImage .
创建容器
如果docker部署spring boot
应用需要连接mysql
不能使用127.0.0.1
连接,这是因为docker部署的spring boot
应用也是一个小型的linux
虚拟机,因此不能访问外面的宿主机(即安装docker
应用的主机)因此可以在spring.datasource.url
里配置域名访问,然后创建容器时指定在Hosts
文件添加域名映射 (相当于让yml里指定的jdbc:mysql://www.sensor.com:3306/tonrain
找到真正的ip)
docker run --name sensor --add-host www.sensor.com:192.168.56.10 -p 8080:8080 -d sensorImage
或者通过设置Environment
添加启动参数(启动参数配置比yml里的配置优先级高)
docker run --name sensor -e spring.datasource.url='jdbc:mysql://192.168.56.10:3306/tonrain?useSSL=false' -p 8080:8080 -d sensorImage
导出镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
exmaple:
docker save tomcat -o /myimg.tar
导入镜像
docker load -i 镜像保存文件位置
docker生成springboot镜像
3.3、1. 环境信息
java 1.8
2. 准备程序文件
- 文件准备
- 创建一个空文件夹docker-test
- 将springboot项目打包成可执行jar,放到文件夹;
- 将application.properties复制出来,保存成config.properties;
- 新建一个文本名为Dockerfile,去掉扩展名;
如下:
docker-test
├── Dockerfile
├── config.properties
└── demo.jar
因为demo要连接mysql容器中的MySQL数据库,因此要先查看mysql容器的ip地址:
配置mysql容器的IP
查看mysql内部IP
docker inspect mysql

把172.17.0.2配置到config.properties中
3. 写Dockerfile
# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基础镜像使用java
FROM openjdk:oraclelinux8
# 作者
MAINTAINER ccl <[email protected]>
# 声明要使用的端口
EXPOSE 8080
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD demo.jar /app/app.jar
ADD config.properties /app/config.properties
# 运行jar包
ENTRYPOINT ["sh","-c","java -Dspring.config.location=/app/config.properties -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar"]
4. 生成镜像
使用命令
docker build -t demo .
查看生成的镜像:
demo就是
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo latest 38e095527f1e 18 minutes ago 544MB
redis latest 93f2223d3607 4 weeks ago 107MB
docker/getting-started latest 720f449e5af2 4 weeks ago 27.2MB
mysql/mysql-server latest 087c6f86492c 7 weeks ago 509MB
也可以在客户端程序看:
这样就说明已经打包成镜像了。
5. 启动容器
- 启动
使用命令:
docker run -d -p 8081:8080 --link mysql --name demo demo
参数说明: run:启动
-d :后台启动
-p :端口映射,后面跟主机端口和容器端口
–link:连接另一个容器,后面跟容器的名字,比如demo要使用mysql容器中的MySQL数据库,这样配置后demo容器就可以访问mysql容器了,不然网络不通;
–name :生成的容器的名字,不指定的话会随机命名,不易区分。 最后的demo是镜像的名字。
- 查看容器
使用命令:docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd443339ff2 demo "sh -c 'java -Dsprin…" 30 minutes ago Up 30 minutes 0.0.0.0:8081->8080/tcp demo
7aa165fe0620 mysql/mysql-server:latest "/entrypoint.sh mysq…" 3 days ago Up 14 hours (healthy) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp mysql
0ae371dde311 redis "docker-entrypoint.s…" 4 weeks ago Up 14 hours 0.0.0.0:6379->6379/tcp redis-test
d2dfb0d259b0 docker/getting-started "/docker-entrypoint.…" 4 weeks ago Up 13 hours 0.0.0.0:80->80/tcp gifted_robinson
或者docker desktop:

- 进入容器
可以查看容器内部文件 使用命令
$ docker exec -it demo /bin/sh
sh-4.4# ls
app bin dev home lib64 mnt proc run srv tmp var
app.jar boot etc lib media opt root sbin sys usr
sh-4.4# cd app
sh-4.4# ls app
ls: cannot access 'app': No such file or directory
sh-4.4# ls
app.jar config.properties
sh-4.4# cd ..
sh-4.4# ls tmp/
hsperfdata_root tomcat-docbase.8080.4168017359765144938 tomcat.8080.11638847895460439748
sh-4.4#
也可以在docker desktop进入:

6. 验证容器内程序是否可用
可以访问成功,并从mysql容器中获取到数据了,完美。乱码是小事。

7. 复制文件到容器
我想要改容器中config.properties文件中的内容,但是,我打包的镜像中没有vi vim yum apt-get 等各种基本工具,也不知道怎么安装,有知道的大佬请留言,感谢!
所以,为了不重新构建镜像,我找到了另外一个方法,就是直接将主机的文件复制到容器中:
docker cp config.properties demo:/app/
命令解释
cp copy的缩写
config.properties为主机当前目录下的源文件
demo是容器的名字,也可以用容器的ID
冒号后面是要复制到的路径,路径后也可带文件名,复制过去就叫指定的名字了。
文件若已存在,会直接覆盖,不会提示。
也可以从容器中将文件复制出来:
# 将demo容器中/app/config.properties文件复制到当前目录
docker cp demo:/app/config.properties .
既然文件能直接复制到容器中,那么jar也可以啊,那改了代码完全没必要重新构建镜像了啊。。。
3.4、docker修改参数
docker build -f ./Dockerfile -t sensor .
docker run --name product --add-host www.sensor.com:192.168.56.10 -p 8080:8080 -d level-scanner-product
docker run --name sensor -e spring.datasource.url='jdbc:mysql://192.168.56.10:3306/tonrain?useSSL=false&serverTimezone=UTC&useEncoding=true&characterEncoding=UTF-8&rewriteBatchedStatements=true' -p 8089:8089 -d sensor