内网私有仓库
1、Docker 私有仓库 是集中存放镜像的地⽅,⽽注册服务器 (Registry)是存放仓库的具体服务器。仓库可以被认为是⼀个具体 的项⽬或⽬录。
Docker 公共仓库:https://hub.docker.com
2、Docker 私有仓库的作⽤:
1)镜像上传到公共仓库不⽅便管理,且仅需要局域⽹⽤户之间传递 镜像的情况,需要使⽤私有仓库。
2)节省⽹络带宽,不需要都去公共仓库下载镜像,只需要从私有仓 库下载即可。
3)提供镜像资源利⽤,针对公司内部开发,不能联⽹情况下,有⼀ 些使⽤到的镜像可以推送到本地的私有仓库中,以供内部开发⼈ 员便捷下载使⽤。
3、搭建 Docker 私有仓库的⽅案
1)docker 官⽅提供的搭建私有仓库⼯具 registry。
2)harbor 私有仓库。
镜像文件的打包传输
[root@docker ~]# docker save --help
Options:
-o, --output string Write to a file,
instead of STDOUT
[root@docker ~]# docker save -o cetos.tar centos:latest
[root@docker ~]# ls
anaconda-ks.cfg centos.tar soft
# 查看现有的镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
# 如果有该镜像生成的容器正在使用,无法使用rmi移除镜像,删除容器时先退出up状态
[root@2315e0c58cf2 /]# read escape sequence
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2315e0c58cf2 centos:latest "/bin/bash" 41 minutes ago Up 38 minutes
[root@docker ~]# docker rm c0
[root@docker ~]# docker rmi centos:latest
# 可以将tar包发给别人,也可以做备份
[root@docker ~]# docker load -help
[root@docker ~]# docker load -i centos.tar centos:latest
Loaded image: centos:latest
容器导出镜像
1、从容器导出tar包
# 查看帮助文档
[root@docker ~]# docker export --help
Options:
-o, --output string Write to a file,
instead of STDOUT
# 使用指令
[root@docker ~]# docker export -o centos_yum.tar c0
# 查看新生成的tar包
[root@docker ~]# ls
anaconda-ks.cfg centos_yum.tar centos.tar soft
【容器包】 【镜像包】
2、从tar包导入镜像
# 查看帮助
[root@docker ~]# docker import --help
Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 导入格式 docker import -m 说明内容 centos_yum.tar centos:yum
[root@docker ~]# docker import -m yum centos_yum.tar centos:yum
sha256:2bc7103237afec105becf835eff717f84e3e0bb137f57c2f4a5e8c3201a770e1
# 查看新镜像,此镜像不需要配置yum仓库
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos yum 2bc7103237af 22 seconds ago 260MB
centos latest 5d0da3dc9764 2 years ago 231MB
案例:
1、启动创建容器
# 删除原有的容器
[root@docker001 ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b24d60a94c5 centos:latest "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago c1 9fb6f46b3809 centos:latest "/bin/bash" 12 minutes ago Exited (0) 12 minutes ago c0 [root@docker001 ~]# docker rm c0 c0
[root@docker001 ~]# docker rm c1 c1
[root@docker001 ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 创建并启动服务
[root@docker001 ~]# docker run -it --name=c0 centos:latest /bin/bash
2、配置yum源
#查看版本
[root@2dc8e93c2c86 /]# cat /etc/redhat-release
CentOS Linux release 8.4.2105
# 阿⾥云开发者社区
https://developer.aliyun.com/mirror/centos? spm=a2c6h.13651102.0.0.3e221b11NPSvpg
# 下载repo⽂件
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault8.5.2111.repo
yum clean all && yum makecache
yum -y install epel-release
3、导出为镜像
# 查看帮助⽂件 ,找到导出的指令
[root@docker001 ~]# docker --help
#查看export帮助
[root@docker001 ~]# docker export --help
# 导出tar CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2dc8e93c2c86 centos:latest "/bin/bash" 17 minutes ago Exited (0) 6 minutes ago c0
[root@docker001 ~]# docker export --output centos_aliyun_yum.tar c0
[root@docker001 ~]# ls anaconda-ks.cfg centos_aliyun_yum.tar centos.tar frp initserver.sh
4、从tar包导入镜像
#查看import帮助
[root@docker001 ~]# docker --help
# 查看 import帮助
[root@docker001 ~]# docker import --help
# 导⼊为镜像
[root@docker001 ~]# docker import -m aliyun_yum centos_aliyun_yum.tar centos_yum:v0 sha256:191d9c84f461ccd06c249fbefad169fdbc6f22e60eba b410b428814b2e690d0c
[root@docker001 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_yum v0 191d9c84f461 48 seconds ago 260MB centos latest 5d0da3dc9764 2 years ago 231MB
[root@docker001 ~]# docker history centos_yum:v0 IMAGE CREATED CREATED BY SIZE COMMENT 191d9c84f461 3 minutes ago 260MB aliyun_yum
##练习:创建一个镜像,包含httpd服务,名称 centos,版本为http
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80e2c487c9ed centos:yum "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago c1
4f60d6296a26 centos:latest "yum" 5 minutes ago Exited (0) 5 minutes ago c0
# c0容器时基于yum镜像的容器,这样省去了每次要配置yum
[root@docker ~]# docker export -o centos_httpd.tar c0
[root@docker ~]# ls
anaconda-ks.cfg centos_yum.tar soft
centos_httpd.tar cetos.tar
[root@docker ~]# docker import -m httpd centos_httpd.tar centos:http
sha256:bd158f51103991b4f4b46be0403db16542ce20b87aa0e96ab8485788d74ac0db
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos http bd158f511039 6 seconds ago 232MB
centos yum 2bc7103237af 14 minutes ago 260MB
centos latest 5d0da3dc9764 2 years ago 231MB
数据的持久化存储
背景:因为docker容器只是⼀个⼯具,不需要保存数据,不需要做持 久化,如果要做持久化,那么就需要保存到宿主机上,需要宿主机 和容器之间有⼀个共享卷。
格式:docker run -it --name c0 -v /source:/data centos:httpd /bin/bash
【宿主机文件】【容器内部文件内】
案例:
# 在宿主机上创建目录/static,挂载到容器的/data/目录,不管在宿主机还是dokcer中创建文件,互相可见
[root@docker ~]# mkdir /static
[root@docker ~]# docker run -it --name c0 -v /static/:/data/ centos:http /bin/bash
[root@61ae74fcf69b /]# ls
bin etc lib64 mnt root srv usr
data home lost+found opt run sys var
dev lib media proc sbin tmp
[root@docker ~]# touch /static/xy.txt
[root@docker ~]# docker exec c0 ls /data/
xy.txt
[root@docker ~]# docker attach c0
[root@61ae74fcf69b /]# touch /data/mn.txt
[root@61ae74fcf69b /]# read escape sequence
[root@docker ~]# ls /static/
mn.txt xy.txt
查看容器ip地址的方式
1、进入容器,使用指令查看
[root@docker ~]# docker start c1
c1
[root@docker ~]# docker attach c1
[root@80e2c487c9ed /]# yum -y install net-tools | iproute
[root@80e2c487c9ed /]# ifconfig | ip a s
2、在容器外使用docker指令的inspect查看
[root@docker ~]# docker inspect --help
[root@docker ~]# docker inspect c1
[root@docker ~]# docker inspect centos:http
3、在外部调用指令
[root@docker ~]# docker exec c1 ifconfig
虚拟机端口映射
说明:
1、Docker允许通过外部访问容器或者容器之间互联的⽅式来提供⽹络服务。
2、容器启动之后,容器中可以运⾏⼀些⽹络应⽤,通过-p或-P参数来 指定端⼝映射。 /3、宿主机的⼀个端⼝只能映射到容器内部的某⼀个端⼝上,⽐如: 8080->80之后,就不能8080->81。
4、容器内部的某个端⼝可以被宿主机的多个端⼝映射,⽐如: 8080- >80,8090->80,8099->80。
5、-p ⼩写p表示docker会选择⼀个具体的宿主机端⼝映射到容器 内部开放的⽹络端⼝上。
-P ⼤写P表示docker会随机选择⼀个宿主机端⼝映射到容器内 部开放的⽹络端⼝上
1、指定端口映射
格式:
docker run -it --name c0 -p80:80/tcp centos:httpd /bin/bash //将容器中的80端⼝映射到宿主机(docker主机)80端⼝
# 查看容器状态:
# 查看使⽤的端⼝
[root@docker001 ~]# less /etc/services
注意:端⼝号,属于稀缺资源,随机给⼀个端⼝⼤于等于32768
案例:
[root@docker001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE centos_httpd v0 fffc96d791d5 52 minutes ago 309MB centos_yum v0 191d9c84f461 About an hour ago 260MB centos latest 5d0da3dc9764 2 years ago 231MB
[root@docker001 ~]# docker run -it --name c0 -p 80:80/tcp centos_httpd:v0 /bin/bash
【容器内端口】:【宿主机端口】
# 启动httpd服务
[root@3265f84cd9c2 /]# httpd -k start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[root@3265f84cd9c2 /]# curl http://localhost:80
docker httpd test ----
# 在宿主机上是可以访问的
[root@docker001 ~]# curl http://172.17.0.1:80
docker httpd test ----
# 访问⾃⼰的80端⼝也可以访问httpd服务
[root@docker001 ~]# curl http://localhost:80
docker httpd test ----
# 远程主机也可以访问服务
2、随机端口映射,映射端⼝>=32768
格式:docker run -it --name c1 -p80 centos:httpd /bin/bash
案例:
[root@docker001 ~]# docker run -it --name c0 -p 80 centos_htd:v0 /bin/bash [root@1451df257a8e /]# [root@docker001 ~]#
[root@docker001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1451df257a8e centos_httpd:v0 "/bin/bash" 18 seconds ago Up 18 seconds 0.0.0.0:32770- >80/tcp, :::32770->80/tcp c0
3、指定其他ip的端口映射,添加一块虚拟网卡,ip地址设置为192.168.2.51
格式:docker run -it --name c0 -p192.168.2.51 centos:httpd /bin/bash
192.168.71.51:32768
案例:
[root@docker001 ~]# ifconfig ens33:0 192.168.2.51 broadcast 192.168.2.51 netmask 255.255.255.255 up
[root@docker001 ~]# docker run -it --name c0 - p192.168.251::80 centos_httpd:v0 /bin/bash oot@e6649818d033 /]#
ctrl +p+q
[root@docker001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6649818d033 centos_httpd:v0 "/bin/bash" About a minute ago Up About a minute 192.168.2.51:32768->80/tcp c0