t

titaniume

V1

2022/08/28阅读:20主题:极客黑

docker使用

docker 概述

docker 安装

手动安装

卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装 Docker Engine-Community

设置仓库

 sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

安装docker

sudo yum install docker-ce docker-ce-cli containerd.io

查看docker版本

docker version

启动docker

sudo systemctl start docker 

卸载docker

删除安装包

yum remove docker-ce

删除镜像,容器,配置文件等

rm -rf /var/lib/docker

运行hello-world

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally#本地没有这个镜像会去仓库下载这个
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest

Hello from Docker! 
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
image
image

docker 的常用命令

帮助命令

docker version      #显示docker的版本信息。
docker info         #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help   #帮助命令

帮助文档的地址:docker build | Docker Documentation

镜像命令

docker images查看所有本地主机上的镜像

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   4 months ago   13.3kB
centos        latest    5d0da3dc9764   4 months ago   231MB

#
 解释
#REPOSITORY    # 镜像的仓库源
#TAG           # 镜像的标签
#IMAGE ID      # 镜像的id
#CREATED       # 镜像的创建时间
#SIZE          # 镜像的大小

#
 可选项
Options:
-a, --all Show all images (default hides intermediate images) #列出所有镜像
-q, --quiet Only show numeric IDs   # 只显示镜像的id

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag]
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker pull mysql:5.7 t #如果不写tag,默认就是latest
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete   #分层下载: docker image 的核心 联合文件系统
93619dbc5b36: Pull complete  
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94 # 签名防伪
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 #真实地址

#
等价于 
docker pull mysql:5.7
docker pull docker.io/library/mysql:5.7

删除镜像

docker rmi -f 镜像id                     #删除指定的镜像
docker rmi -f $(docker images -aq)       #删除全部镜像

容器命令

docker run 镜像id      #新建容器并启动
docker ps             #列出所有运行的容器 docker container list
docker rm 容器id          #删除指定的容器
docker start 容器id      #启动容器
docker restart 容器id  #重启容器
docker stop 容器id      #停止当前正在运行的容器
docker kill 容器id      #强行停止当前容器

说明:我们有了镜像才可以创建容器,Linux,下载centos镜像来学习

新建容器并启动

docker run [可选参数] image | docker container run [可选参数] image
#参书说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写) 随机指定端口
# 测试、启动并进入容器
[root@iZm5ect9h9unbi32cf5f1zZ ~]#  docker run -it centos /bin/bash
[root@0026f5b6495c /]# ls 
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@0026f5b6495c /]# exit #从容器退回主机
exit
[root@iZm5ect9h9unbi32cf5f1zZ ~]# 

列出所有运行的容器

#docker ps命令 #列出当前正在运行的容器

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker ps  #正在运行的容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker ps -a #所有容器
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
0026f5b6495c   centos    "/bin/bash"   3 minutes ago   Exited (0) 2 minutes ago             elastic_keldysh
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker ps -aq #所有容器 只显示容器id
0026f5b6495c

退出容器

exit             #容器直接退出
ctrl + P + Q     #容器不停止退出

删除容器

docker rm 容器id                       #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq)         #删除所有容器
docker ps -a -q|xargs docker rm     #删除所有的容器

启动和停止容器操作

docker start 容器id     #启动容器
docker restart 容器id  #重启容器
docker stop 容器id     #停止容器
docker kill 容器id     #强制停止当前容器

常用其他命令

后台启动命令

#命令 docker run -d 镜像名称

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker run -d centos
57148ca7010335e508acbc8218c5d260c1327161ac3c8c26cbc78fea4f8ab44c
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZm5ect9h9unbi32cf5f1zZ ~]# 
# 问题docker ps. 发现centos 停止了 
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs --help
#模拟输出日志
[root@iZm5ect9h9unbi32cf5f1zZ ~] docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done"
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker logs -t --tail 10 666f31941549ea3de9c50f6db7c1edc2d0d010d6ecd20b3d714b8f3f5c4d0ed9
2022-02-11T00:45:59.536044666Z 6666
2022-02-11T00:46:00.537800643Z 6666
2022-02-11T00:46:01.540095384Z 6666
2022-02-11T00:46:02.543222146Z 6666
2022-02-11T00:46:03.545905624Z 6666
2022-02-11T00:46:04.547676467Z 6666
2022-02-11T00:46:05.549908315Z 6666
2022-02-11T00:46:06.551228407Z 6666
2022-02-11T00:46:07.553588418Z 6666
2022-02-11T00:46:08.556603615Z 6666

#
显示日志 
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数 
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志

查看容器中的进程

#命令 docker top 容器id
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker top e02f1d37c7fa
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                65650               65631               0                   11:23               pts/0               00:00:00            /bin/bash

查看镜像的元数据

#命令 docker inspect 容器id
#测试
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker inspect e02f1d37c7fa
[
    {
        "Id": "e02f1d37c7fae52dbfd225c196cbd4dc73370d228dcad29ca8f95b3a21b89580",
        "Created": "2022-02-11T03:23:15.640300587Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 65650,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-02-11T03:23:16.123135296Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
       .....
    }
]

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令 
docker exec -it 容器id bashshell
#测试
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
e02f1d37c7fa   centos    "/bin/bash"   5 minutes ago   Up 5 minutes             focused_brown
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker exec -it e02f1d37c7fa /bin/bash
[root@e02f1d37c7fa /]# 

#
方式二
docker attach 容器id
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker attach e02f1d37c7fa
[root@e02f1d37c7fa /]#  ....正在执行的代码

#
区别
#docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
#docker attach # 进入容器正在执行的终端

从容器内靠边到主机

#命令 docker cp 容器id:    容器内部路径 主机的路径
#进去容器内部
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker attach e02f1d37c7fa
[root@e02f1d37c7fa /]# ls            
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@e02f1d37c7fa /]# touch test.java #新建一个文件
[root@e02f1d37c7fa /]# exit 
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker cp e02f1d37c7fa:/test.java / #拷贝
[root@iZm5ect9h9unbi32cf5f1zZ ~]# cd /
[root@iZm5ect9h9unbi32cf5f1zZ /]# ls #可以看到test.java 已经存在了
 bin   boot   dev   etc   home   lib   lib64   media   mnt   opt   proc   root   run   sbin   srv   sys   test.java  't | grep rabbitmq'   tmp   usr   var

小结

Docker命令帮助文档(重要)

image
image

实战

docker安装nginx

#1.搜索镜像 docker search nginx 建议dockerhub 搜索 可以看文档
#2.现在镜像 pull
[root@iZm5ect9h9unbi32cf5f1zZ /]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3.运行测试

#
 -d 后台运行
# --name 给容器命名
# -p 宿主机端 ,容器内部端口

[root@iZm5ect9h9unbi32cf5f1zZ /]# docker run -d --name nginx01 -p 3344:80 nginx #启动nginx 对外开放3344端口
9531ee192053902cd70d087f556eb3acaae5f2dc0eef8c4b87134f40e594cd74
[root@iZm5ect9h9unbi32cf5f1zZ /]# docker ps 
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
9531ee192053   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 6 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
[root@iZm5ect9h9unbi32cf5f1zZ ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZm5ect9h9unbi32cf5f1zZ ~]# 

端口暴露的概念

image
image

访问 http://118.190.135.94:3344/

注意打开阿里云安全组 3344端口

image
image

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker exec -it 9531ee192053 /bin/bash #进入nginx容器
root@9531ee192053:/# whereis nginx  #定位nginx配置文件路径
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9531ee192053:/# cd /etc/nginx/
root@9531ee192053:/etc/nginx# ls
conf.d    fastcgi_params    mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@9531ee192053:/etc/nginx# 

思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,要是可以在容器外部提

供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?→ 数据卷!

docker安装tomcat

查看官方文档

https://hub.docker.com/_/tomcat

#官方使用

docker run -it --rm tomcat:9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到 # docker run -it --rm image 一般是用来测试,用完就删除(暂时不建议)

#
下载在启用
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker pull tomcat:9.0

#
启动运行
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
0e29546d541c: Already exists 
9b829c73b52b: Already exists 
cb5b7ae36172: Already exists 
6494e4811622: Already exists 
668f6fcc5fa5: Already exists 
dc120c3e0290: Already exists 
8f7c0eebb7b1: Already exists 
77b694f83996: Already exists 
0f611256ec3a: Pull complete 
4f25def12f23: Pull complete 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
1856dd6ae7eba2be6bf42bd813371e53c435ce1cd5eb2ca3de2ecddc281874da

#
进入容器
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker exec -it tomcat01 /bin/bash

#
发现问题
#1.linux命令少了 2.没有webapps 阿里云镜像的原因。默认是最小镜像,所有不必要的都会被剔除掉
#保证最小可运行环境


#
拷贝webapps.dist 里面的内容到webapps 下面
root@1856dd6ae7eb:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@1856dd6ae7eb:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步内部就好了!

访问 http://118.190.135.94:3355/

注意打开阿里云安全组 3355端口

image
image

docker 部署es+kibana

# es 暴露的端口很多! 
# es 十分耗内存 
# es 的数据一般需要放置到安全目录!挂载 
# --net somenetwork ? 网络配置 
# 下载启动elasticsearch(Docker一步搞定)
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker network create somenetwork
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#
测试 es是否成功启动
[root@iZm5ect9h9unbi32cf5f1zZ ~]# curl localhost:9200
{
  "name" : "96a5aab224d3",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "dDEtWq7wQxCz-r9B8QMYCw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}


#
 查看docker容器使用内存情况(每秒刷新,也挺耗内存的一个命令)
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker stats

#
关闭,添加内存的限制,修改配置文件 -e 环境配置修改
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker rm -f 96a5aab224d3
96a5aab224d3
[root@iZm5ect9h9unbi32cf5f1zZ ~]#  docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

#
再次测试 es启动成功
[root@iZm5ect9h9unbi32cf5f1zZ ~]# curl localhost:9200
{
  "name" : "3021c8a3eaef",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "o1TcFf0ATuyiJRCyXRW6SA",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

原来

20220211153706012.png
20220211153706012.png

现在 优化后添加启动参数 -e ES_JAVA_OPTS="-Xms64m -Xmx512m

20220211153352579.png
20220211153352579.png

使用kibana连接es?思考网络如何才能连接。

image
image

可视化

  • portainer 先用这个
  • rancher(CI/CD再用)

什么是portainer

Docker图形化界面管理工具!提供一个后台面板供我们操作!

# 运行如下命令即可 打开可视化服务

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

#
 测试
[root@iZm5ect9h9unbi32cf5f1zZ ~]# curl localhost:8088
<!DOCTYPE html
><html lang="en" ng-app="portainer">
  <head>
    <meta charset="utf-8" />
    <title>Portainer</title>
    .....

#
 外网访问 http://ip:8088

http://118.190.135.94:8088/

注意打开阿里云安全组 8088端口

第一次节目输入2次密码 admin123 就会出现这个界面

image
image

这个是进去之后的面板

image
image

容器数据卷

MySQL实战

#获取镜像
docker pull mysql:5.7

#
运行容器,需要做数据挂载
#官方测试 安装启动mysql,需要配置密码的,这是要注意的 (-e MYSQL_ROOT_PASSWORD=my-secret-pw)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#
启动我们的
-d 后台运行
-p 端口映射
-v 挂载卷
-e 环境配置
--name容器名字
 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v  /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

本地使用navicat测试 连接,注意这里对外是3310端口 ,要去阿里云安全组开放这个端口

image
image

我们在navicat上创建一个数据库,发现数据已经同步到宿主机了

image
image
image
image

假设我们将容器删除 本地的数据卷依旧没有丢失 这就实现了容器数据持久化功能

image
image

具名和匿名挂载

#匿名挂载
-v 容器内路径
#-P 随机指定端口
docker run -d -P --name nginx02 -v /etc/nginx nginx 

#
查看所有的volume的情况
#这里发现,这种就是匿名挂载,我们在 -v 只写了容器内路径,没有写容器外路径
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     7d27d47973b2f3fdcf2716bffab28dde5059cb05e6f59c4b71d0d07ee9d195ea


#
具名挂载
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
4d3a9673b2e6a0346571d39fb64f8995cc766b76f25ff9bf1abdac5ba7b181dc
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     7d27d47973b2f3fdcf2716bffab28dde5059cb05e6f59c4b71d0d07ee9d195ea
local     df6275599e932686a4fd9a60fbc388bc2f448c6011b2f260a667899ccc67fb41
local     juming-nginx
#通过 -v 卷名:容器内路径
#查看一下这个卷
image
image

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以很方便的找到我们的卷,大多数情况使用 具名挂载

#如何确定是具名挂载还是匿名挂载,还是指定路径挂载?

-v 容器内路径                    #匿名挂载
-v 卷名:容器内路径             #具名挂载
-v /宿主机路径:容器内路径       #指定路径挂载

扩展

#通过 -v 容器内路径 : ro rw 改变读写权限
ro  readonly #只读
rw  readwrite #可读可写
#一旦这个设置了容器权限,容器对我们挂载出来的内容就又限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx

#
ro 只要看到ro就说明这个路径只能通过宿主机操作,容器内无法操作

初识dockerfile

dockerfile 就是用来构件docker镜像的文件、命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令都是一层

#1.创建一个dockerfile文件,名字可以随机取,建议dockerfile
#2.文件的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "------end----------"

CMD /bin/bash

#
3.构建镜像
# docker build -f /home/docker-test-volume/dockerfile1 -t titaniume/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in c234c0886ebf
Removing intermediate container c234c0886ebf
 ---> 5460029d3f2f
Step 3/4 : CMD echo "------end----------"
 ---> Running in 9adafa08b199
Removing intermediate container 9adafa08b199
 ---> 7e1e7e2cdee0
Step 4/4 : CMD /bin/bash
 ---> Running in 476ee72fb314
Removing intermediate container 476ee72fb314
 ---> a78a7f9d3cb7
Successfully built a78a7f9d3cb7
Successfully tagged titaniume/centos:1.0


#
这里的命令,就是镜像的一层
image
image

启动自己的容器

image
image

这个卷和外部一定有一个同步的目录

image
image

在容器内 volume01目录下创建一个文件

image
image

查看一下卷挂载路径 ,看下刚才创建的文件是否同步过去了

#daa8766160f4 容器id
docker inspect daa8766160f4
image
image
image
image

我们发现 文件已经同步过去了。

这种方式在未来我们使用的十分多、因为我们通常会构建自己的镜像

假设构建镜像时候没有挂载卷、要手动镜像挂载卷 -v卷名:容器内路径

数据卷容器

多个mysql数据同步

image
image
# 启动3个容器  通过我们刚刚自己写的容启动
# 1.启动docker01 (父容器)后按 ctrl+Q+P 退出容器 后台运行
docker run -it --name docker01 titaniume/centos:1.0
# 2.启动docker02   ctrl+Q+P 退出容器
docker run -it --name docker02 --volumes-from docker01 titaniume/centos:1.0 
# 3.启动docker03
docker run -it --name docker03 --volumes-from docker01 titaniume/centos:1.0
image
image
image
image
image
image
image
image
image
image
#测试 可以删除docker01 查看docker02和docker03是否可以访问这个文件
#测试依旧可以访问
image
image

多个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7

#
这个时候可以实现2个容器数据同步

结论:容器之间配置信息传递,数据卷容器生命周期一直持续到没有容器使用为止,但是一旦持久化到了本地,这个时候 本地数据是不会被删除的。

DockerFile

dockerFile 介绍

dockerfile 是用来构建docker镜像的文件、命令参数脚本

构建步骤

  1. 编写一个dockerfile文件

  2. docker build 构建一个镜像

  3. docker run 运行镜像

  4. docker push 发布镜像(DockerHub 阿里云镜像仓库)

    查看一下官方是怎么做的?

https://hub.docker.com/_/centos

image
image
image
image

官方很多都是基础包,很多功能都没有,我们通常会自己搭建镜像

官方既然可以制作镜像,那我们也可以

dockerfile构建过程

基础知识

  1. 每个保留字(指令)都必须是大写
  2. 按从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建一个新的镜像层并提交

image

dockerfile 是面向开发的,我们以后要发布项目,作镜像,就需要编写 dockerfile 文件,这个文件十分简单!

Docker 镜像逐渐成为企业交付的标准,必须要掌握!

步骤:开发,部署,运维。。。缺一不可!

DockerFile:构建文件,定义了一切步骤,源代码

DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品!

Docker 容器:容器就是镜像运行起来提供的服务器

DockerFile的指令

FROM   # 基础镜像 一切从这里开始
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN    # 镜像构建的时候需要运行的命令
ADD    # 步骤:tomcat 镜像,这个tomcat压缩包 
WORKDIR# 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD    # 指定这个容器启动的hi后要运行的命令(只有最后一个会生效,可被替代)
ENTRYPOINT # 指定这个容器启动的时候要运行的命令(可追加命令)
ONBUILD # 当构建被继承 DockerFIle 这个时候就会运行
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
image
image

实战测试构建镜像

Docker Hub 中 99% 的镜像都是从这个基础的镜像过来的 FROM scratch 然后配置需要的软件和配置进行构建

image
image

创建一个自己的centos

因为centos8 停止维护 导致yum源找不到 这里我们 指定centos7做测试 1.拉取centos7的镜像 docker pull centos:7 2.编写dockerfile ,拉取的centos7 是没有vim 和 ifconfig 这2个命令的 ,我们把这2个工具给安装上去 ,重新打包一个镜像

#创建文件,执行dockerfile 
cd /home
mkdir dockerfile-centos

#
3.编写脚本
# 基础镜像
FROM centos:7
# 作者信息
MAINTAINER titaniume<titaniume@163.com>

#
 自定义工作目录(就是你进容器中默认所在目录,你可以进容器后直接PWD)
ENV MYPATH /user/local
WORKDIR $MYPATH

#
 编译竟像时安装两个linux上常用的工具
RUN yum -y install vim
RUN yum -y install net-tools

#
 暴露的端口
EXPOSE 80

#
 运行后打印几个信息并进入到控制台
CMD echo $MYPATH
CMD echo "--------end----------"
CMD /bin/bash


#
4.执行构建
#命令  docker build -f dockerfile 文件路径 -t 镜像名:[tag]
docker build -f mydockerfile-centos -t mycentos:0.1 .

5.测试运行 发现已经支持这几个基础命令了

image
image

我们还可以查看镜像的变更历史 docker history 镜像ID

image
image

平时我们也可以通过查看历史这种方式 了解镜像的编译内容

CMD 和 ENTRYPOINT的区别

CMD          #指定这个容器这个容器启动的时候运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT    #指定这个额容器启动的时候要运行的命令,可以追加命令

测试CMD

#编写 dockerfile 文件

FROM centos:7
CMD ["ls","-a"]


#
构建镜像
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .


#
run 运行 发现我们的ls -a 命令生效
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker run 82a728fb2fec
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var


#
想追加一个命令 -l  ls-al
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker run 82a728fb2fec -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

#
CMD 情况下 -l替换了 CMD ["ls","-a"] 命令 ,-l 不是命令 所以会报错

测试 ENTRYPOINT

[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# vim dockerfile-cmd-entrypoint

FROM centos:7
ENTRYPOINT ["ls","-a"]
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in f000fb39d304
Removing intermediate container f000fb39d304
 ---> fb4e47f4e871
Successfully built fb4e47f4e871
Successfully tagged entrypoint-test:latest
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker run fb4e47f4e871
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

#
我们的追加命令 是直接凭借在我们的ENTRYPINT 后面的
[root@iZm5ect9h9unbi32cf5f1zZ dockerfile]# docker run fb4e47f4e871 -l
total 12
drwxr-xr-x   1 root root     6 Feb 12 09:30 .
drwxr-xr-x   1 root root     6 Feb 12 09:30 ..
-rwxr-xr-x   1 root root     0 Feb 12 09:30 .dockerenv
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   5 root root   340 Feb 12 09:30 dev
drwxr-xr-x   1 root root    66 Feb 12 09:30 etc
drwxr-xr-x   2 root root     6 Apr 11  2018 home
lrwxrwxrwx   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x   2 root root     6 Apr 11  2018 media
drwxr-xr-x   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x 131 root root     0 Feb 12 09:30 proc
dr-xr-x---   2 root root   114 Nov 13  2020 root
drwxr-xr-x  11 root root   148 Nov 13  2020 run
lrwxrwxrwx   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x  13 root root     0 Feb 12 09:30 sys
drwxrwxrwt   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x  13 root root   155 Nov 13  2020 usr
drwxr-xr-x  18 root root   238 Nov 13  2020 var

dockerfile很多命令都十分相似 下,我们需要了解它们的区别,最好的学习就对比然后测试

实战部署tomcat镜像

1、准备镜像文件 tomcat压缩包 ,jdk压缩包

https://tomcat.apache.org/download-90.cgi

https://www.oracle.com/java/technologies/downloads/#java8-linux

image
image

2、编写dockerfile文件、官方命名Dockerfile build 会自动寻找这个文件 就不需要-f

FROM centos:7
MAINTAINER titaniume<titaniume@163.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u321-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.58.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_321
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.58
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out

3、构建镜像

docker build -t diytomcat .

4、启动镜像

[root@iZm5ect9h9unbi32cf5f1zZ tomcat]# docker run -d -p 9090:8080 --name titaniumetomcat -v /home/titaniume/build/tomcat/test:/usr/local/apache-tomcat-9.0.58/webapps/test -v/home/titaniume/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.58/logs diytomcat

5、查看容器和宿主机

#进入容器内 
[root@iZm5ect9h9unbi32cf5f1zZ tomcat]# docker exec -it ee8b03cbc37b051 /bin/bash
[root@ee8b03cbc37b local]#  默认就是在usr/local目录下面

我们可以到宿主机已经有 test 花和 tomcatlogs 这2个文件夹了 ,到时候我们就可以把项目发布到test目录下面

image
image

curl localhost:9090 返回一些页面标签 通说明配置成功

http://118.190.135.94:9090/ 访问tomcat

6、访问测试

7、发布项目 (由于做了卷挂载,我们可以直接在本地编写项目就可以发布了)

创建web.xml

image
image

创建index.jsp

image
image

发布成功就可以直接访问了

image
image

我们还可以查看tomcat日志

[root@iZm5ect9h9unbi32cf5f1zZ tomcatlogs]# pwd
/home/titaniume/build/tomcat/tomcatlogs
[root@iZm5ect9h9unbi32cf5f1zZ tomcatlogs]# ls
catalina.2022-02-13.log  host-manager.2022-02-13.log  localhost_access_log.2022-02-13.txt
catalina.out             localhost.2022-02-13.log     manager.2022-02-13.log
[root@iZm5ect9h9unbi32cf5f1zZ tomcatlogs]# cat catalina.out 
image
image

发布镜像到DokerHub

1、注册自己的dockerhub账号

https://hub.docker.com/

2、登录自己的账号 提交镜像

用户名:titnaiumes
邮箱:titaniume@163.com
密码:docker55673819

3、在 我们服务上提交自己的镜像

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

4、登录完毕以后就可以提交镜像了,就是一步 docker push

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker login -u titaniumes
Password: 
Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker login -u titaniumes
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#push 自己的镜像到服务器上
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker push diytomcat 
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
17c432869e24: Preparing 
34244e723b25: Preparing 
f1cf5e34d75a: Preparing 
b0061fe1bda1: Preparing 
174f56854903: Preparing 
denied: requested access to the resource is denied #拒绝


#
push镜像问题?
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker push titaniumes/diytomcat:1.0 
The push refers to repository [docker.io/titaniumes/diytomcat]
An image does not exist locally with the tag: titaniumes/diytomcat

#
解决 增加一个tag
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker tag dbaf09df24f7 titaniumes/tomcat:2.0

#
docker push上去即可 自己发布的镜像尽量带上版本号
[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker push  titaniumes/tomcat:2.0
The push refers to repository [docker.io/titaniumes/tomcat]
17c432869e24: Pushing [=========>                                         ]  39.16MB/210.5MB
34244e723b25: Pushing [==================================================>]  16.61MB
f1cf5e34d75a: Pushing [==>                                                ]  19.21MB/365.3MB
b0061fe1bda1: Pushed 
174f56854903: Pushing [=======>                                           ]  28.87MB/203.9MB

提交的时候也是按照镜像的层级来提交的

发布镜像到阿里云

1.登录阿里云

2、找到容器镜像服务

3、创建命名空间

image
image

4、创建容器镜像 (选择本地仓库)

image
image

5、浏览阿里云

1. 登录阿里云Docker Registry
$ docker login --username=titaniumes registry.cn-qingdao.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像
$ docker pull registry.cn-qingdao.aliyuncs.com/titaniumes/titaniumes-test:[镜像版本号]

3. 将镜像推送到Registry
$ docker login --username=titaniumes registry.cn-qingdao.aliyuncs.com
$ docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/titaniumes/titaniumes-test:[镜像版本号]
$ docker push registry.cn-qingdao.aliyuncs.com/titaniumes/titaniumes-test:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-qingdao.aliyuncs.com 作为Registry的域名登录。

5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

$
 docker images
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-qingdao.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。

$
 docker push registry-vpc.cn-qingdao.aliyuncs.com/acs/agent:0.7-dfb6816

实际操作可以按照阿里云上的步骤操作

[root@iZm5ect9h9unbi32cf5f1zZ ~]# docker login --username=titaniumes registry.cn-qingdao.aliyuncs.com

[root@iZm5ect9h9unbi32cf5f1zZ ~]#  docker tag dbaf09df24f7 registry.cn-qingdao.aliyuncs.com/titaniumes/titaniumes-test:3.0

[root@iZm5ect9h9unbi32cf5f1zZ ~]#  docker push registry.cn qingdao.aliyuncs.com/titaniumes/titaniumes-test:3.0

总结

image
image

分类:

后端

标签:

运维部署

作者介绍

t
titaniume
V1