Docker学习笔记

2024-11-01 11:13:43
13
3

Docker为什么会出现?

传统的开发过程中,开发者在本地开发应用,然后由运维部署到服务器上; 在这个过程中,开发环境和服务器环境是相对独立的。 例如:开发人员在本地搭建了mysql、nginx等。运维人员也需要在服务器上安装相应的应用,相当于不同的环境不同的人做了相同的事情。

docker就是为了解决这样子的痛点出现,docker的核心思想是隔离,docker可以做到应用跟环境一起打包成镜像,运维只需要拉取对应的镜像就能 直接运行,不需要单独再配置环境。

Docker安装前的准备

1,查看centos环境
# 查看指令 uname -r    
#系统内核是3.10以上的[root@xianxin ~]# uname -r3.10.0-957.21.3.el7.x86_64[root@xianxin ~]# 
#系统版本[root@xianxin ~]# cat /etc/os-releaseNAME="CentOS Linux"VERSION="7 (Core)"ID="centos"ID_LIKE="rhel fedora"VERSION_ID="7"PRETTY_NAME="CentOS Linux 7 (Core)"ANSI_COLOR="0;31"CPE_NAME="cpe:/o:centos:centos:7"HOME_URL="https://www.centos.org/"BUG_REPORT_URL="https://bugs.centos.org/"​CENTOS_MANTISBT_PROJECT="CentOS-7"CENTOS_MANTISBT_PROJECT_VERSION="7"REDHAT_SUPPORT_PRODUCT="centos"REDHAT_SUPPORT_PRODUCT_VERSION="7"​[root@xianxin ~]# ​

Docker正式安装流程

1,卸载旧的版本
#  1,首先卸载旧的版本sudo yum remove docker \                  
docker-client \                  
docker-client-latest \                  
docker-common \                  
docker-latest \                  
docker-latest-logrotate \                  
docker-logrotate \                  
docker-engine
2,安装需要的安装包
sudo yum install -y yum-utils
3,设置镜像库
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
4,更新软件包索引
## centos7sudo yum  makecache fast## centos8sudo yum  makecache
5,安装docker docker-ce 社区 ee 企业版
sudo yum install docker-ce docker-ce-cli containerd.io
6,启动docker
sudo systemctl start docker
7,判断启动成功
docker version
8,启动 hello-world 程序
sudo docker run hello-world
9,查看下载的hello-world镜像
# 指令 docker images[root@xianxin ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZEhello-world   latest    d1165f221234   5 months ago   13.3kB
10,卸载Docker
sudo yum remove docker-ce docker-ce-cli containerd.io
11,删除Docker资源
 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd

Docker底层原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个命令!

Docker常用命令

systemctl start docker     
# 启动dockersystemctl restart docker   
# 重启dockersystemctl stop docker END  
# 关闭docker#########################################################
docker  version  # 显示docker的版本信息,验证docker是否启动成功docker  info     
#  显示docker的系统信息,包括镜像和容器的数量
dockers  --help  # 帮助命令

Docker镜像常用命令

下载镜像
docker pull # 下载镜像
# 命令dokcer  pull  '镜像名'   # 默认安装最新版本docker  pull  '镜像名:tag' # 安装指定版本# 例如安装mysqldocker  pull mysql    # 默认安装最新版本dockers pull mysql:5.7  # 安装5.7版本
查看本机上所有的镜像
docker images
docker images           # 查看本机上所有的镜像[root@xianxin ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED        SIZEhello-world   latest    d1165f221234   5 months ago   13.3kB# 解释REPOSITORY   # 镜像的仓库源TAG          # 镜像的标签IMAGE ID     # 镜像的IDCREATED      # 镜像的创建时间SIZE         # 镜像大小
可选项
  • -a # 列出所有的镜像
  • -1 # 只显示镜像id
  • 查看镜像的元数据
# 命令docker inspect 镜像id# 测试[root@xianxin ~]# docker inspect 300e315adb2f[    {        "Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",        "RepoTags": [            "centos:latest"        ],        "RepoDigests": [            "centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1"        ],        "Parent": "",        "Comment": "",        "Created": "2020-12-08T00:22:53.076477777Z",        "Container": "395e0bfa7301f73bc994efe15099ea56b8836c608dd32614ac5ae279976d33e4",        "ContainerConfig": {            "Hostname": "395e0bfa7301",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "Tty": false,            "OpenStdin": false,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/sh",                "-c",                "#(nop) ",                "CMD [\"/bin/bash\"]"            ],            "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {                "org.label-schema.build-date": "20201204",                "org.label-schema.license": "GPLv2",                "org.label-schema.name": "CentOS Base Image",                "org.label-schema.schema-version": "1.0",                "org.label-schema.vendor": "CentOS"            }        },        "DockerVersion": "19.03.12",        "Author": "",        "Config": {            "Hostname": "",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "Tty": false,            "OpenStdin": false,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/bash"            ],            "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {                "org.label-schema.build-date": "20201204",                "org.label-schema.license": "GPLv2",                "org.label-schema.name": "CentOS Base Image",                "org.label-schema.schema-version": "1.0",                "org.label-schema.vendor": "CentOS"            }        },        "Architecture": "amd64",        "Os": "linux",        "Size": 209348104,        "VirtualSize": 209348104,        "GraphDriver": {            "Data": {                "MergedDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/merged",                "UpperDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/diff",                "WorkDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/work"            },            "Name": "overlay2"        },        "RootFS": {            "Type": "layers",            "Layers": [                "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859"            ]        },        "Metadata": {            "LastTagTime": "0001-01-01T00:00:00Z"        }    }][root@xianxin ~]# 
搜索镜像
docker search # 搜索镜像
[root@xianxin ~]# docker search  mysqlNAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql                             MySQL is a widely used, open-source relation…   11281     [OK]       mariadb                           MariaDB Server is a high performing open sou…   4280      [OK]   
可选项
  • --filter # 根据条件筛选

例如:

# 筛选点赞数超过5000的mysql镜像[root@xianxin ~]# docker search mysql --filter=STARS=5000NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql     MySQL is a widely used, open-source relation…   11281     [OK]       [root@xianxin ~]# 
删除镜像
docker rmi -f 镜像id  # 删除指定的镜像​docker rmi -f 镜像id  镜像id  # 删除多个镜像​docker rmi -f $(docker images -aq)  # 删除全部的镜像

Docker容器常用命令

说明:有镜像才能创建容器,先下载一个centos镜像来学习

docker pull centos
创建容器并启动
docker run [option] images

可选参数:

  • -d # 以后台方式运行
  • -it # 使用交互方式运行,并进入容器查看内容
  • -p # 指定容器端口,例如 -p 8080:8080 (宿主机端口8080映射容器8080端口)-p # ip:主机端口:容器端口-p # 主机端口:容器端口(常用)-p # 容器端口
  • -P # 大写P随机指定端口
# 测试并进入容器docker run -it centos /bin/bash
退出容器,返回到宿主机
# 指令exit		 # 直接停止容器并且退出ctrl+p+q	 # 容器不停止退出
列出运行的容器
docker ps [option]

可选项:

  • docker ps # 默认列出当前正在运行的容器
  • -a # 列出当前正在运行的容器+历史运行过的容器
  • -n # 列出最近创建的容器数,例如 -n=5
  • -q # 只显示容器的编号id
  • 启动和停止容器的操作
docker start  	容器id    # 启动容器docker restart  容器id  	# 重启容器docker  stop  	容器id  	# 停止当前正在运行的容器docker  kill  	容器id  	# 强制停止当前容器
删除容器
docker rm  容器id  					# 删除指定的容器,不能删除正在运行的容器docker rm -f $(docker ps -aq)  		 # 删除所有的容器docker ps -a -q |xargs docker rm 	 # 删除所有的容器
进入正在运行的容器
方式一
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置docker exec -it 容器id  bashShell# 测试[root@xianxin ~]# docker run  -it centos /bin/bash[root@9d09131b4a00 /]# [root@xianxin ~]# [root@xianxin ~]# docker psCONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES9d09131b4a00   centos    "/bin/bash"   15 seconds ago   Up 14 seconds             admiring_kalam[root@xianxin ~]# docker exec -it 9d09131b4a00 /bin/bash[root@9d09131b4a00 /]# lsbin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var[root@9d09131b4a00 /]# ps -efUID        PID  PPID  C STIME TTY          TIME CMDroot         1     0  0 13:33 pts/0    00:00:00 /bin/bashroot        15     0  0 13:36 pts/1    00:00:00 /bin/bashroot        30    15  0 13:36 pts/1    00:00:00 ps -ef[root@9d09131b4a00 /]# 
方式二
docker attach 容器id# 测试  [root@xianxin ~]# docker psCONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES9d09131b4a00   centos    "/bin/bash"   7 minutes ago   Up 7 minutes             admiring_kalam[root@xianxin ~]# docker attach 9d09131b4a00[root@9d09131b4a00 /]# 
两种方式比较说明
docker exec       # 进入容器后开启一个新的终端,可以在里面操作(常用)docker attach     #  进入容器正在执行的终端,不会启动新的进程。
从容器内拷贝文件到宿主机上
# 命令docker cp 容器id:容器内的路径  目标主机路径# 测试[root@9d09131b4a00 /]# lsbin  etc   isxch.txt  lib64	  media  opt   root  sbin  sys	usrdev  home  lib	      lost+found  mnt	 proc  run   srv   tmp	var[root@xianxin ~]# docker cp 9d09131b4a00:/isxch.txt  /  # 从容器内复制 isxch.txt 到宿主机上[root@xianxin /]# lsbin   dev  home       lib    lost+found  mnt  patch  root  sbin  sys           tmp  varboot  etc  isxch.txt  lib64  media       opt  proc   run   srv   test_xianxin  usr  www[root@xianxin /]# 
查看日志
docker logs --helpdocker logs -f -t --tail 容器id
注意事项说明
# 命令 docker run -d 镜像名[root@xianxin ~]# docker run -d centos6128514eba8c01903f51b8e8cd14104e91450b3cf844f4af661f3ca029fc1974# 问题  docker ps   发现  centos  停止了# 常见的坑:docker 容器使用后台运行,就必须有一个前台进程,docker发现没有应用,就会自动停止# nginx , 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
插件安装
apt-get update# 安装pingapt install iputils-ping# 安装 vimapt-get install vim

如何提交一个自己的镜像

commit镜像

指令
# 创建指令docker commit [option]# 查看镜像指令docker inspect imagesId

参数

  • -m # 镜像备注
  • -a # 作者信息
  • 举例
# 列出当前镜像列表[root@xianxin ~]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEcentos       latest    300e315adb2f   8 months ago   209MB# 启动一个镜像[root@xianxin ~]# docker run --name mycentos -it 300e315adb2f /bin/bash[root@24c4081a5e1a /]# [root@xianxin ~]# # 查看当前运行的镜像[root@xianxin ~]# docker psCONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES24c4081a5e1a   300e315adb2f   "/bin/bash"   26 seconds ago   Up 25 seconds             mycentos# 制作提交镜像[root@xianxin ~]# docker commit -m="我的第一个centos" -a="xianxin" 24c4081a5e1a firstcentos:1.0sha256:ff755542b89ffe661ec7c8fb0344778d5de031648993bd2eed10ccd31dccec37# 重新列出镜像列表  firstcentos 镜像是刚刚提交生成的[root@xianxin ~]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED         SIZEfirstcentos   1.0       ff755542b89f   7 seconds ago   209MBcentos        latest    300e315adb2f   8 months ago    209MB[root@xianxin ~]# # 查看镜像源信息[root@xianxin ~]# docker inspect ff755542b89f[    {        "Id": "sha256:ff755542b89ffe661ec7c8fb0344778d5de031648993bd2eed10ccd31dccec37",        "RepoTags": [            "firstcentos:1.0"        ],        "RepoDigests": [],        "Parent": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",        # 刚刚提交的备注信息        "Comment": "我的第一个centos",        "Created": "2021-08-20T15:06:27.218260388Z",        "Container": "24c4081a5e1abca783b03beba1e85da3cfeeef8288a7ece2683a4ef977ee4d90",        "ContainerConfig": {            "Hostname": "24c4081a5e1a",            "Domainname": "",            "User": "",            "AttachStdin": true,            "AttachStdout": true,            "AttachStderr": true,            "Tty": true,            "OpenStdin": true,            "StdinOnce": true,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/bash"            ],            "Image": "300e315adb2f",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {                "org.label-schema.build-date": "20201204",                "org.label-schema.license": "GPLv2",                "org.label-schema.name": "CentOS Base Image",                "org.label-schema.schema-version": "1.0",                "org.label-schema.vendor": "CentOS"            }        },        "DockerVersion": "20.10.8",        # 提交的作者名字        "Author": "xianxin",        "Config": {            "Hostname": "24c4081a5e1a",            "Domainname": "",            "User": "",            "AttachStdin": true,            "AttachStdout": true,            "AttachStderr": true,            "Tty": true,            "OpenStdin": true,            "StdinOnce": true,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/bash"            ],            "Image": "300e315adb2f",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {                "org.label-schema.build-date": "20201204",                "org.label-schema.license": "GPLv2",                "org.label-schema.name": "CentOS Base Image",                "org.label-schema.schema-version": "1.0",                "org.label-schema.vendor": "CentOS"            }        },        "Architecture": "amd64",        "Os": "linux",        "Size": 209348104,        "VirtualSize": 209348104,        "GraphDriver": {            "Data": {                "MergedDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/merged",                "UpperDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/diff",                "WorkDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/work"            },            "Name": "overlay2"        },        "RootFS": {            "Type": "layers",            "Layers": [                "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859"            ]        },        "Metadata": {            "LastTagTime": "2021-08-20T23:06:27.224406777+08:00"        }    }][root@xianxin ~]# 

容器数据卷的使用

什么是容器数据卷?实际就是虚拟机与宿主机之间的数据挂载

# 命令docker run -it -v 主机目录:容器目录# 测试# 列举镜像[root@xianxin home]# docker images REPOSITORY    TAG       IMAGE ID       CREATED          SIZEfirstcentos   1.0       ff755542b89f   45 minutes ago   209MBcentos        latest    300e315adb2f   8 months ago     209MB# 创建容器  宿主机/home/volume文件夹内容跟容器内的虚拟机/home/test数据是同步的[root@xianxin home]# docker run -it --name test -v /home/volume:/home/test ff755542b89f /bin/bash# 容器创建成功 并进入列出文件[root@af7fd7d1e78e /]# lsbin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var[root@af7fd7d1e78e /]# cd home[root@af7fd7d1e78e home]# lstest[root@af7fd7d1e78e home]# cd test# 进入test文件夹创建test.txt[root@af7fd7d1e78e test]# touch test.txt[root@af7fd7d1e78e test]# lstest.txt# 退出回到主机[root@af7fd7d1e78e test]# [root@xianxin home]# [root@xianxin home]# lsadmin  redis  volume  www[root@xianxin home]# cd volume/#进入/home/volume文件夹 查看文件  此时容器内部创建的文件已经同步到宿主机对应挂载目录上[root@xianxin volume]# lstest.txt[root@xianxin volume]# 

删除单个数据卷或删除全部数据卷的命令如下:

删除单个数据卷

要删除单个数据卷,可以使用以下命令:

docker volume rm <volume_name>

例如,要删除名为 my_volume 的数据卷,可以使用:

docker volume rm my_volume

删除全部未使用的数据卷

要删除所有未使用的数据卷(即没有被任何容器挂载的卷),可以使用以下命令:

docker volume prune

这个命令会提示你确认是否要删除所有未使用的卷:

WARNING! This will remove all local volumes not used by at least one container.Are you sure you want to continue? [y/N]

输入 y 确认删除。

强制删除所有数据卷

如果你想强制删除所有数据卷,可以使用以下命令,这样不会有确认提示:

docker volume rm $(docker volume ls -q)

这个命令会删除所有列出的卷,但要注意,这样会删除所有数据卷,包括正在使用的卷,可能导致数据丢失。请谨慎使用。

总结:

  • 删除单个数据卷:docker volume rm <volume_name>
  • 删除未使用的数据卷:docker volume prune
  • 强制删除所有数据卷:docker volume rm $(docker volume ls -q)

匿名挂载、具名挂载、指定路径挂载

挂载指令
-v  容器内路径                # 匿名挂载-v  卷名:容器内路径            # 具名挂载-v  /宿主机路径:容器内路径      # 指定路径挂载# 测试docker run -d -p:8088:80 --name testnginx -v /etc/nginx nginx:latest# 挂载成功后 查看卷的情况(罗列出挂载卷) 指令docker volume ls# 查看卷挂载在具体的位置 指令docker volume inspect 生成的卷名# 注意事项 只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的ro  #  只读rw  #  可读可写# 测试docker run -d -p:8088:80 --name testnginx -v /etc/nginx:ro nginx:latest
匿名挂载
匿名挂载就是没有指定在主机的挂载路径也没有命名卷名
# 指令 -v 容器内的路径[root@xianxin volume]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED             SIZEfirstcentos   1.0       ff755542b89f   About an hour ago   209MBnginx         latest    dd34e67e3371   3 days ago          133MBcentos        latest    300e315adb2f   8 months ago        209MB# 运行挂载nginx测试 [root@xianxin volume]# docker run -d -p:8088:80 --name testnginx -v /etc/nginx nginx:latest5c7ffb2dd44a67e9d687b9c062f5632059dca34001985f1af53e4d9777ee153e# 启动成功  查看卷名[root@xianxin volume]# docker volume lsDRIVER    VOLUME NAMElocal     5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1local     712dd7d0b8dcffc04b48962129074a526122bff3c1f4340150ade77c57f68335local     ffa6bb562be59d9ca9a70512bd811aeca337dd824ebbc88154f8e7560482fa6e# 查看卷挂载的路径[root@xianxin volume]# docker inspect 5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1[    {        "CreatedAt": "2021-08-19T21:55:05+08:00",        "Driver": "local",        "Labels": null,        # 这里就是卷挂载的位置        "Mountpoint": "/var/lib/docker/volumes/5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1/_data",        "Name": "5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1",        "Options": null,        "Scope": "local"    }]

浏览器访问主机8088端口:

具名挂载

具名挂载就是给挂载卷起一个名字
# 指令 -v 卷名:容器内的路径[root@xianxin /]# docker run -d -p 8089:80 --name testnginx02 -v hanvename:/etc/nginx nginx:latest4b0102acaad11de4318990a21d8d83f45d459ea55a3367f3a8c45e950c7c528c# 查看卷名< hanvename >挂载的目录[root@xianxin /]# docker volume inspect hanvename[    {        "CreatedAt": "2021-08-21T00:22:45+08:00",        "Driver": "local",        "Labels": null,        # 卷< hanvename >挂载的位置        "Mountpoint": "/var/lib/docker/volumes/hanvename/_data",        "Name": "hanvename",        "Options": null,        "Scope": "local"    }][root@xianxin /]# 
指定路径挂载
指定路径挂载就是指定挂载在宿主机的指定目录
docker run -d -p 8090:8080 --name testnginx03 -v /home/test:/etc/nginx nginx:latest
小结
  1. 只要挂载成功,挂载文件夹数据变动,两边都是保持一致;
  2. 删除容器,容器内的数据是会随着容器删除的,但是挂载在宿主机上的数据还会保留;

安装mysql

# 获取镜像docker pull mysql:5.7# 官方使用方法docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 启动数据挂载到本地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

初步认识Dockerfile

Dockerfile 就是用来构建docker镜像的构建文件命令脚本,先体验一下!

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

1,创建一个dockerfile文件,名字可以随机,建议命名为dockerfile

文件内容及参数如下,指令需要大写

# 在home目录下新建dockerfile文件[root@xianxin home]# vim dockerfile# 文件的内容如下FROM centosVOLUME ['volume01','volume02']CMD echo '---end---'CMD /bin/bash# 这里的每个命令都是镜像的一层

# 此时文件夹已经生成dockerfile文件[root@xianxin home]# lsadmin  dockerfile  redis  test  volume  www# 执行 build 构建命令[root@xianxin home]# docker build -f /home/dockerfile -t newcentos:1.0 .# 注意命令的最后面需要以点号 . 为结尾# 下面为构建解析过程Sending build context to Docker daemon  44.03kBStep 1/4 : FROM centos ---> 300e315adb2fStep 2/4 : VOLUME ['volume01','volume02'] ---> Running in 9738df348b5cRemoving intermediate container 9738df348b5c ---> c62819a0113bStep 3/4 : CMD echo '---end---' ---> Running in ae4ee1194b38Removing intermediate container ae4ee1194b38 ---> e56f8d85ae2dStep 4/4 : CMD /bin/bash ---> Running in f5fe795647e2Removing intermediate container f5fe795647e2 ---> 725692f3be89Successfully built 725692f3be89Successfully tagged newcentos:1.0# 构建打包 newcentos:1.0 成功,已经在镜像列表可以查看[root@xianxin home]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED          SIZEnewcentos     1.0       725692f3be89   21 seconds ago   209MBfirstcentos   1.0       ff755542b89f   17 hours ago     209MBnginx         latest    dd34e67e3371   3 days ago       133MBcentos        latest    300e315adb2f   8 months ago     209MB

DockerFile指令

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

发布镜像

发布到DockerHub
注册dockerhub账号

1,地址 https://hub.docker.com 注册自己账号;

2、注册成功后,登录账号

# 登录命令docker login --helpUsage:  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[root@xianxin home]# # 登录命令 docker login -u username -p password[root@xianxin home]# docker login -u *** -p ***WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store# 提示登录成功Login Succeeded[root@xianxin home]# 

3、发布镜像

# 命令docker push 镜像#测试[root@xianxin home]# docker push newcentos:1.0

4、扩展问题:修改镜像版本

# 命令docker tag  镜像id  镜像版本号# 测试[root@xianxin home]# docker tag 725692f3be89 editcentos:2.0[root@xianxin home]# docker imagesREPOSITORY    TAG       IMAGE ID       CREATED          SIZEeditcentos    2.0       725692f3be89   47 minutes ago   209MBnewcentos     1.0       725692f3be89   47 minutes ago   209MBfirstcentos   1.0       ff755542b89f   18 hours ago     209MBnginx         latest    dd34e67e3371   3 days ago       133MBcentos        latest    300e315adb2f   8 months ago     209MB[root@xianxin home]# 
发布到阿里云容器服务
阿里云镜像服务上
  1. 登录阿里云
  2. 找到镜像服务
  3. 创建命名空间
  4. 创建镜像仓库

Docker 网络

理解dockers0
1、测试 查看本地 ip 此时发现 有三个网络

2、安装并运行一个tomcat 再次查看网络ip
# 安装并运行tomcat  然后 再次查看网络 IP[root@xianxin home]#  docker run -d -P --name tomcat01 tomcatUnable to find image 'tomcat:latest' locallylatest: Pulling from library/tomcat1cfaf5c6f756: Pull complete c4099a935a96: Pull complete f6e2960d8365: Pull complete dffd4e638592: Pull complete a60431b16af7: Pull complete 4869c4e8de8d: Pull complete 9815a275e5d0: Pull complete c36aa3d16702: Pull complete cc2e74b6c3db: Pull complete 1827dd5c8bb0: Pull complete Digest: sha256:1af502b6fd35c1d4ab6f24dc9bd36b58678a068ff1206c25acc129fb90b2a76aStatus: Downloaded newer image for tomcat:latestd9dfd057081469b8ccc4ffc7c3180590b2c422c9cdab39675544a6adbb950264# 从新查看网络ip[root@xianxin home]# ip addr1: 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 forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:16:3e:04:90:14 brd ff:ff:ff:ff:ff:ff    inet 172.22.45.71/18 brd 172.22.63.255 scope global dynamic eth0       valid_lft 313872318sec preferred_lft 313872318sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:e6:6d:c4:52 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# 安装运行后 这个是多出来的网络45: vethd3b4a7d@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether a2:a1:ff:82:9a:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0[root@xianxin home]# docker psCONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                     NAMESd9dfd0570814   tomcat    "catalina.sh run"   7 minutes ago   Up 7 minutes   0.0.0.0:49153->8080/tcp   tomcat01# 进入正在运行的  tomcat01 容器  并查看容器 ip[root@xianxin home]# docker exec -it d9dfd0570814 /bin/bashroot@d9dfd0570814:/usr/local/tomcat# ip addr1: 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 forever44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0       valid_lft forever preferred_lft forever# 回到主机 并 ping  容器id[root@xianxin home]# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.052 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.049 ms64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.051 ms64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.058 ms64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.050 ms64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.050 ms# 发现主机是可以ping容容器的
3、再次安装一个tomcat02 再重新查看网络
[root@xianxin home]# docker run -d -P --name tomcat02 tomcatde6e8535396971635bb5ba00ef3ab6b63ff14684077d1bfec3c77c5ac0c65413[root@xianxin home]# ip addr1: 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 forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:16:3e:04:90:14 brd ff:ff:ff:ff:ff:ff    inet 172.22.45.71/18 brd 172.22.63.255 scope global dynamic eth0       valid_lft 313870826sec preferred_lft 313870826sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:e6:6d:c4:52 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 forever45: vethd3b4a7d@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether a2:a1:ff:82:9a:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0# 这里是新多出来的网络51: veth6a2310a@if50: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether fa:d8:3e:9e:27:29 brd ff:ff:ff:ff:ff:ff link-netnsid 1[root@xianxin home]# # 查看tomcat02容器网络ip[root@xianxin home]# docker exec -it de6e85353969 /bin/bashroot@de6e85353969:/usr/local/tomcat# ip addr1: 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 forever50: eth0@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0       valid_lft forever preferred_lft foreverroot@de6e85353969:/usr/local/tomcat# # 容器tomcat02 ping 容器 tomcat01root@de6e85353969:/usr/local/tomcat# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.087 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.082 ms64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.070 ms64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.090 ms64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.084 ms# 发现容器tomcat02 是可以 ping通 tomcat01的
原理

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

小扩展

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

结论

tomcat01和tomcat02是公用的一个路由器,docker0

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认可用ip

小结

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker

容器互联 --link

创建一个tomcat03 并设置链接 tomcat02
[root@xianxin home]# docker psCONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                     NAMESde6e85353969   tomcat    "catalina.sh run"   34 minutes ago   Up 34 minutes   0.0.0.0:49155->8080/tcp   tomcat02d9dfd0570814   tomcat    "catalina.sh run"   59 minutes ago   Up 59 minutes   0.0.0.0:49153->8080/tcp   tomcat01# 创建一个tomcat03 并设置链接 tomcat02[root@xianxin home]# docker run -d -P --name tomcat03 --link tomcat02 tomcatfdf1db72367a23814480df6b4cf83cb19e0703f702fb140a94f6b9f80908413f# 进入tomcat03 并直接 ping tomcat02  是可以直接ping通的[root@xianxin home]# docker exec -it tomcat03 ping tomcat02PING tomcat02 (172.17.0.3) 56(84) bytes of data.64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.112 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.083 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.068 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.080 ms

tomcat03 能直接ping通tomcat02其实是在本地配置了tomcat02的配置

[root@xianxin home]# docker psCONTAINER ID   IMAGE     COMMAND             CREATED             STATUS             PORTS                     NAMESfdf1db72367a   tomcat    "catalina.sh run"   12 minutes ago      Up 12 minutes      0.0.0.0:49156->8080/tcp   tomcat03de6e85353969   tomcat    "catalina.sh run"   48 minutes ago      Up 48 minutes      0.0.0.0:49155->8080/tcp   tomcat02d9dfd0570814   tomcat    "catalina.sh run"   About an hour ago   Up About an hour   0.0.0.0:49153->8080/tcp   tomcat01# 进入tomcat03 查看配置[root@xianxin home]# docker exec -it fdf1db72367a cat /etc/hosts127.0.0.1	localhost::1	localhost ip6-localhost ip6-loopbackfe00::0	ip6-localnetff00::0	ip6-mcastprefixff02::1	ip6-allnodesff02::2	ip6-allrouters172.17.0.3	tomcat02 de6e85353969172.17.0.4	fdf1db72367a[root@xianxin home]# 
本质探究

--link 就是我们在hosts配置中增加了一个 172.17.0.3 tomcat02 de6e85353969

我们现在玩Docker已经不建议使用 --link了!

自定义网络

查看所有的docker网络
# 命令docker network ls# 测试[root@xianxin ~]# docker network lsNETWORK ID     NAME      DRIVER    SCOPE5f24c676e10f   bridge    bridge    localbc8730852967   host      host      locala6534f0ad4fb   none      null      local[root@xianxin ~]# 
网络模式

bridge : 桥接docker(默认)

none : 不配置网络

host : 和宿主机共享网络

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

网路连通

docker基础容器中bash: vi: command not found问题解决

我们在创建基础容器之后,进入容器,进行编辑配置文件的时候,需要使用vim或者vi命令,但是会出现

bash: vim: command not found

这是因为vim没有安装。

解决

使用如下命令安装:

apt-get updateapt-get install vim

然后就可以了

Docker Compose

官方介绍

定义、运行多个容器

所有环境都可以使用Compose

三步骤:

1,Dockerfile 保证我门的项目在任何地方运行

作用:批量容器编排

Compose是Docker官方开源项目,需要安装!

安装Compose

查看容器IP

# 查看容器Iddocker inspect 容器ID或容器名

评论

文章评论--评论内容需审核不会在页面显示
禁止提交违法、欺诈、诽谤、骚扰、色情或其他有害内容