跳至主要內容

三、docker相关

apzs...大约 14 分钟

三、docker相关

3.1、Docker 安装open in new window


使用官方安装脚本自动安装

安装命令如下:

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、常用命令open in new window

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官方镜像搜索open in new window

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文件

目录结构:

image-20221215161858131
image-20221215161858131

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 镜像保存文件位置

3.3、docker生成springboot镜像open in new window

1. 环境信息

java 1.8

2. 准备程序文件

  • 文件准备
  1. 创建一个空文件夹docker-test
  2. 将springboot项目打包成可执行jar,放到文件夹;
  3. 将application.properties复制出来,保存成config.properties;
  4. 新建一个文本名为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
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.0.0-alpha.8