docker学习记录


docker 的基本使用

docker镜像命令和容器命令

uTools_1683184235571.png

uTools_1683184257569.png


==docker 作业练习==

==Docker 安装 Nginx==


# -d后台运行
#--name   给容器起名字
# -p 宿主机端口:容器内部端口
chy@ocean:~$ docker run -d --name nginx01 -p 8000:80 nginx
c83728c3f1d2d20cba7571a6fd08c506cb5bc14b1fbb9385b8fca0e687615e4d
chy@ocean:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                   NAMES
c83728c3f1d2   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:8000->80/tcp, :::8000->80/tcp   nginx01


chy@ocean:~$ curl localhost:8000
<!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>

截图

==作业:docker 来装一个tomcat==

docker run -it --rm tomcat:9.0

# --rm 一般用来测试,用完就删 

作业三:部署es+kibana

# es暴露端口多
#es 十分的耗内存
#es的数据一般挂在到安全目录!挂载
# --net somenetwork  网络配置
docker stats查看docker所用内存

-e环境配置修改

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

chy@ocean:~$ curl localhost:9200
{
  "name" : "c41cc3475bc3",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "bhypk5Q-RvC4x_FOMoFF-g",
  "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"
}

==可视化==

  • portainer(先用这个)
docker run -d -p 8080:9000\

--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

==什么是portainer==

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

访问测试:http://192.168.1.40:8088


docker 镜像

截图

==commit镜像==


docker commit 提交容器成为一个新的副本

docker commit -m=提交的描述信息  -a=“作者 ” 容器 id 目标镜像名:[TAG]

docker commit -a="chy" -m="add webapps application" 8f9660706542 tomcat_chy:1.0

==容器数据卷==

什么是容器数据卷

截图

总结一句话:容器的持久化和同步操作!容器间也可以进行数据共享的!


使用数据卷


方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录 类似于-p

docker run -it -v /home/chy/docker_ubuntu18_home:/home ubuntu:18.04 /bin/bash

"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/chy/docker_ubuntu18_home",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

chy@ocean:~/docker_ubuntu18_home$ vim ceshi.py 

[2]+  已停止               vim ceshi.py
chy@ocean:~/docker_ubuntu18_home$ docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS       PORTS                                       NAMES
d11b0f59e8b1   portainer/portainer   "/portainer"   5 hours ago   Up 5 hours   0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   elated_davinci
chy@ocean:~/docker_ubuntu18_home$ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                   CREATED          STATUS                      PORTS                                       NAMES
d591bed7171e   ubuntu:18.04          "/bin/bash"               22 minutes ago   Exited (0) 21 minutes ago                                               wizardly_spence
d11b0f59e8b1   portainer/portainer   "/portainer"              5 hours ago      Up 5 hours                  0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   elated_davinci
c83728c3f1d2   nginx                 "/docker-entrypoint.…"   6 hours ago      Exited (0) 6 hours ago                                                  nginx01
ff3cf19a0b79   ubuntu:18.04          "/bin/bash"               7 hours ago      Exited (127) 7 hours ago                                                lucid_chatterjee
e19f4782e1c5   ubuntu:18.04          "bash"                    7 hours ago      Exited (130) 7 hours ago                                                pedantic_panini
c29921e3edcf   composetest_web       "flask run"               2 weeks ago      Exited (137) 2 weeks ago                                                composetest-web-1
0a446f730c1f   redis:alpine          "docker-entrypoint.s…"   2 weeks ago      Exited (0) 6 days ago                                                   composetest-redis-1
chy@ocean:~/docker_ubuntu18_home$ docker start d591bed7171e
d591bed7171e
chy@ocean:~/docker_ubuntu18_home$ docker ps 
CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS         PORTS                                       NAMES
d591bed7171e   ubuntu:18.04          "/bin/bash"    22 minutes ago   Up 3 seconds                                               wizardly_spence
d11b0f59e8b1   portainer/portainer   "/portainer"   5 hours ago      Up 5 hours     0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   elated_davinci
chy@ocean:~/docker_ubuntu18_home$ docker attach d591bed7171e
root@d591bed7171e:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d591bed7171e:/# cd home/
root@d591bed7171e:/home# ls
ceshi.py
root@d591bed7171e:/home# cat ceshi.py 
hello, linux updata

好处:我们以后修改只需要在本地修改即可,容器内会自动同步


实战:安装MySQL

思考:MySQL的数据持久化的问题

# 官方的运行,有配置密码

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-e 环境配置
#本主机上测试
docker run -d -p 3310:3306 -v /home/chy/docker_volume/mysql/conf:/etc/mysql/conf.d -v /home/chy/docker_volume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWOR=chy --name mysql_chy mysql:5.7

具名和匿名挂载

# 匿名挂载
-v 容器内路径

docker run -d -P --name nginx -v /etc/nginx nginx

# 查看所有volume 的情况

chy@ocean:~$ docker volume ls
DRIVER    VOLUME NAME
local     2198da5e7d86ba5a3de24d1aa71ab791bcb22e94e9f84e3d2f1fef73dc54d6b7
local     a361a22ba8ef6ffffd78f233128054bd668b3e5315adffab8cfa79b5921ea720
local     ba8715be0d242c0a4d004e38640b10c5dd5833f021920f8bd6fc0e830e012ebb

# 这里的乱码号就是匿名容器名

chy@ocean:~$ docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
a221eae136c83f19fa5f87944efa8eb1e9ea7841b8b982c0b2a943626be6842d
chy@ocean:~$ docker volume ls
DRIVER    VOLUME NAME
local     2198da5e7d86ba5a3de24d1aa71ab791bcb22e94e9f84e3d2f1fef73dc54d6b7
local     a361a22ba8ef6ffffd78f233128054bd668b3e5315adffab8cfa79b5921ea720
local     ba8715be0d242c0a4d004e38640b10c5dd5833f021920f8bd6fc0e830e012ebb
local     juming-nginx

#这里的juming-nginx就是具名挂载

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

chy@ocean:~$ docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2023-05-05T10:03:11+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

挂载位置在/var/lib/docker/volumes/XXXX/_data内


#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-V容器内路径  #匿名挂载
-V卷名:容器内路径  #具名挂载
-V/宿主机路径::容器内路径   #指定路径挂载!

==扩展==

#通过-V容器内路径:rorw改变读写权限
ro    readonly   #只读
rw   readwrite  #可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P--name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

==Docker File==

dockerfile介绍


dockerfile是用来构建dokcer镜像的文件!命令参数脚本I

构建步骤:

1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库!)

截图

截图


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

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


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

  • DockerFile:构建文件,定义了一切的步骤,源代码
  • Dockerlmages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
  • Docker容器:容器就是镜像运行起来提供服务器

截图

截图

FROM    #基础镜镜像,一切从这里开始构建
MAINTAINER    #镜像是谁写的,姓名+邮箱
RUN   #镜像构建的时候需要运行的命令
ADD   #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR       #镜像的工作目录
VOLUME      #挂载的目录
EXPOST    #保留端口配置
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD   #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY    #类似ADD,将我们文件拷贝到镜像中
ENV   #构建的时候设置环境变量!









Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

#创建一个dockerfi1e文件,名字可以随机建议Dockerfi1e
#文件中的内容指令(大写)参数

FROM ubuntu:18.04

VOLUME ["volume01","volume02"]#匿名挂载,未来使用特别多

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

CMD /bin/bash

截图


"Mounts": [
    {
        "Type": "volume",
        "Name": "22c524e180d59166fb95b5012971cfe1e5566bca1ceb5ecabd26fbe20d6371c0",
        "Source": "/var/lib/docker/volumes/22c524e180d59166fb95b5012971cfe1e5566bca1ceb5ecabd26fbe20d6371c0/_data",
        "Destination": "volume01",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "20a0e49e357f110e9452991d152ec1a8ac34d48a8c77b0fed84a1d8232f6282b",
        "Source": "/var/lib/docker/volumes/20a0e49e357f110e9452991d152ec1a8ac34d48a8c77b0fed84a1d8232f6282b/_data",
        "Destination": "volume02",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

测试一下刚才的文件是否同步出去了!


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


假设构建镜像时候没有挂载卷,要手动镜像挂载V卷名:容器内路径!


数据卷挂载

多个容器实现数据同步

截图

chy@ocean:~/docker_volume$ docker run -it --name chy_ubuntu02 --volumes-from chy_ubuntu01 chy_ubuntu:1.0  /bin/bash
root@bd9d9eddee71:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02
root@bd9d9eddee71:/# cd volume01
root@bd9d9eddee71:/volume01# ls
docker01.txt
root@bd9d9eddee71:/volume01# touch docker02.txt
root@bd9d9eddee71:/volume01# ls
docker01.txt  docker02.txt
root@bd9d9eddee71:/volume01# ls
docker01.txt  docker02.txt  docker03.txt
root@bd9d9eddee71:/volume01# 

chy@ocean:~$ docker  run -it --name chy_ubuntu03 --volumes-from chy_ubuntu02 chy_ubuntu:1.0 /bin/bash
root@0872aa038cfb:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var       volume02
boot  etc  lib   media  opt  root  sbin  sys  usr  volume01
root@0872aa038cfb:/# cd volume01
root@0872aa038cfb:/volume01# ls
docker01.txt  docker02.txt
root@0872aa038cfb:/volume01# touch docker03.txt
root@0872aa038cfb:/volume01# ls
docker01.txt  docker02.txt  docker03.txt
root@0872aa038cfb:/volume01# 

==主要使用的是 –volumes-from 实现容器间的数据共享 ==

结论:

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

docker-compose常用命令


docker-compose up -d nginx                     构建建启动nignx容器

docker-compose exec nginx bash            登录到nginx容器中

docker-compose down                              删除所有nginx容器,镜像

docker-compose ps                                   显示所有容器

docker-compose restart nginx                   重新启动nginx容器

docker-compose run --no-deps --rm php-fpm php -v  在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

docker-compose build nginx                     构建镜像 。        

docker-compose build --no-cache nginx   不带缓存的构建。

docker-compose logs  nginx                     查看nginx的日志 

docker-compose logs -f nginx                   查看nginx的实时日志

docker-compose config  -q                        验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 

docker-compose events --json nginx       以json的形式输出nginx的docker日志

docker-compose pause nginx                 暂停nignx容器

docker-compose unpause nginx             恢复ningx容器

docker-compose rm nginx                       删除容器(删除前必须关闭容器)

docker-compose stop nginx                    停止nignx容器

docker-compose start nginx                    启动nignx容器

Docker 小结

截图


==Docker 网络(未来安排,集成部署)==

理解Docker0

清空所有环境

测试

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo#本机回环地址
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether c8:7f:54:57:48:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.40/24 brd 192.168.1.255 scope global dynamic noprefixroute enp5s0
       valid_lft 5419sec preferred_lft 5419sec#阿里云内网地址
    inet6 fe80::f8aa:d5c6:44bb:4a07/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
       
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:87:11:cb:17 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever#docker地址
    inet6 fe80::42:87ff:fe11:cb17/64 scope link 
       valid_lft forever preferred_lft forever

三个网络


root@e75dea24bd59:~/catkin_ws# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
        RX packets 35  bytes 4999 (4.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@e75dea24bd59:~/catkin_ws# read escape sequence
chy@ocean:~$ docker ps 
CONTAINER ID   IMAGE                 COMMAND                   CREATED        STATUS          PORTS                                       NAMES
e75dea24bd59   4483fce64730          "/entrypoint-melodic…"   46 hours ago   Up 2 minutes                                                elastic_brown
d11b0f59e8b1   portainer/portainer   "/portainer"              2 days ago     Up 11 minutes   0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   elated_davinci
chy@ocean:~$ ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.078 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.086 ms

#Linux可以ping通docker容器

原理


1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是evth-pair技术!


#我们发现这个容器带来网卡,都是一对对的
# evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
#正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
#Openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

截图


结论:tomcat01和tomcat(02是公用的一个路由器,docker0.
所有的容器不指定网络的情况下,都是docker0路由的,docker:会给我们的容器分配一个默认的可用IP
255.255.0.1/16域局域网
0000000.000000.000000.000000
255.255.255.255

结论


Docker 使用的是Linux的桥接,宿主机中是IGDocker容器的网桥 docker0



截图

Docker 中所哟的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)


只要容器删除,对应网桥一对也没了


自定义网络


查看所有的docker网络

chy@ocean:~$ docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
0e0cf6ea89e8   bridge                bridge    local
2a0cbafc7650   composetest_default   bridge    local
9a4f385414eb   host                  host      local
7772e34bde04   none                  null      local

网络模式

bridge:桥接docker(默认,自己创建也是使用桥接模式)

none:不配置网络

host:和宿主机共享网络

container:容器网络连通!(用的少!局限很大)


Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
#docker0特点:默认,域名不能访问,--1ink可以打通连接!
#我们可以自定义一个网络!
#--driver bridge
#--subnet192.168.0.0/16
#--gateway192.168.0.1
[root@kuangshen /]docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1
mynet
eb21272b3a35 ceaba11b4aa5bbff131c3fb09c4790f0852ed4540707438db052
[root@kuangshen /]docker network 1s

文章作者: oceanechy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 oceanechy !
  目录