赞
踩
目录
多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。
那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。
Docker Hub 是一项基于云的注册表服务,允许您链接到代码存储库、构建映像并对其进行测试、存储手动推送的映像以及指向 Docker Cloud 的链接,以便将映像部署到主机。
它为容器映像发现、分发和更改管理、用户和团队协作以及整个开发管道中的工作流自动化提供了集中式资源。
图像存储库
从社区和官方库中查找和提取映像,以及管理、推送到您有权访问的私有映像库以及从中拉取映像库。
自动构建
在对源代码存储库进行更改时自动创建新映像。
网络钩子
Webhooks 是自动构建的一项功能,可让您在成功推送到存储库后触发操作。
组织
创建工作组以管理对映像存储库的访问。
GitHub 和 Bitbucket 集成
将中心和 Docker 映像添加到当前工作流。
要从远程注册表(例如您自己的 Docker 注册表)获取 Docker 映像并将其添加到本地系统,请使用 docker pull 命令:
```
# docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
```
是一个在 TCP 上提供 docker 分发服务的主机(默认值:5000)
一起 识别由 注册表控制的特定映像
一些注册表也支持原始;对于这些, 是可选的
但是,当它被包括在内时,提供的附加层次结构级别对于区分具有相同图像是有用的
层次结构的附加级别
Namespace | |
---|---|
组织 | redhat/kubernetes, google/kubernetes |
登录(用户名) | Alice/application, bob/application |
角色 | 开发/数据库,测试/数据库,生产/数据库 |
镜像的生成途径:
Dockerfile
基于容器制作
Docker Hub 自动构建
根据容器的更改创建新映像
用法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项 | 违约 | 描述 |
---|---|---|
—作者, -a | 作者(例如,“约翰·汉尼拔·史密斯 hannibal@a-team.com") | |
-c, --更改列表 | 将 Dockerfile 指令应用于创建的映像 | |
-m, --消息字符串 | 提交消息 | |
-p, --暂停 | 真 | 在提交期间暂停容器 |
- [root@localhost ~]# docker pull busybox //拉取镜像
- Using default tag: latest
- latest: Pulling from library/busybox
- 5cc84ad355aa: Pull complete
- Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
- Status: Downloaded newer image for busybox:latest
- docker.io/library/busybox:latest
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- busybox latest beae173ccac6 7 months ago 1.24MB
-
- //--name是代表容器名,--it代表使用镜像创建容器后进入交互式命令
- [root@localhost ~]# docker run --name t1 -it busybox
- / # ls
- bin dev etc home proc root sys tmp usr var
- / # mkdir data
- / # echo 'happy' > data/index.html
- / # cat data/index.html
- happy
- / #

在创建镜像时,我们不能关闭容器,必须使其处于运行状态,所以我们必须要另起一个终端,然后执行
- [root@localhost ~]# docker commit -p t1
- sha256:d71dd4dae383f9d8b175ed36a092cf16a01ff0694a6e5786dafad8cc18207765
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- <none> <none> d71dd4dae383 5 seconds ago 1.24MB
- busybox latest beae173ccac6 7 months ago 1.24MB
- [root@localhost ~]# docker tag d71dd4dae383 servicestt/l1:v0.1
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- servicestt/l1 v0.1 d71dd4dae383 48 seconds ago 1.24MB
- busybox latest beae173ccac6 7 months ago 1.24MB
此时要注意的是,我们的仓库名叫l1,所以我们要在Docker Hub上创建一个名为l1的仓库,然后再将我们做好的镜像push上去。servicestt/l1而前面的services是属于在hub网站自定义的名字,后则是仓库名
- [root@localhost ~]# docker login //拉取日志授权
- Authenticating with existing credentials...
- 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
- [root@localhost ~]# docker push servicestt/l1:v0.1 //从个人仓库中拉取l1镜像使用
- The push refers to repository [docker.io/servicestt/l1]
- 5381ff491e6c: Pushed
- 01fd6df81c8e: Mounted from library/busybox
- v0.1: digest: sha256:c466be3a3d1e1cb5b5a0aa86ebf526dc6c93b1b3cb5b5185099f0ec1655e7010 size: 734
使用新生成的镜像创建容器,并查看在t1容器中创建的html
- [root@localhost ~]# docker run --name b1 -it servicestt/l1:v0.1
- / # ls
- bin data dev etc home proc root sys tmp usr var
- / # ls data/
- index.html
- / # cat data/index.html
- happy
>由此可见,新生成的镜像中是包含了新增的内容的,但是此时有一个问题,那就是容器默认要启动的进程是什么?在这里,默认情况下是启动的sh进程,但我们是要启动一个http站点,所以我们要在创建镜像时将容器默认启动的进程设为httpd,这样一来我们就可以通过新生成的镜像来快速构建一个简单的http站点了。
使用docker inspect命令查看b1容器启动的默认进程是什么
- [root@localhost ~]# docker inspect b1
- [
- ...此处省略N行
- "Cmd": [
- "sh"
- ],
- ...此处省略N行
- "Gateway": "172.17.0.1",
- "IPAddress": "172.17.0.2",
- ...此处省略N行
- ]
重新生成镜像并上传
//这里要求上传的命令为httpd
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 1ea4daffa63a servicestt/l1:v0.1 "sh" 38 minutes ago Up 38 minutes b1
- e5bed605f932 busybox "sh" 2 hours ago Up 2 hours t1
- [root@localhost ~]# docker commit -a 'sean <sean1002@126.com>' -c 'CMD ["/bin/httpd","-f","-h","/data"]' -p b1 servicestt/b1:v0.2
- sha256:51ba93864e4a115f19fc89fd4881e6135712380fc7f0305a5d29a72843b70ba5
//使用新生成的镜像创建容器
- [root@localhost ~]# docker run --name t2 -d servicestt/b1:v0.2
- c2ad25452e1971efb3915a24a514b0900b95c8887050bf764a4b2684882c2bed
- [root@localhost ~]# docker container ls
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- c2ad25452e19 servicestt/b1:v0.2 "/bin/httpd -f -h /d…" About a minute ago Up About a minute t2
使用docker inspect命令查看t2容器启动的默认进程是什么,以及其IP地址,然后用curl命令访问该IP,看是否能访问到网页
- [root@localhost ~]# docker inspect t2
-
- Path": "/bin/httpd",
- "Args": [
- "-f",
- "-h",
- "/data"
- "Gateway": "172.17.0.1",
- "IPAddress": "172.17.0.2",
//查看在次拉取的镜像文件,结果显示使用相同的镜像所属配置也相同
- [root@localhost ~]# curl 172.17.0.2
- happy
假如有2台主机,我们在主机1上做了一个镜像,主机2想用这个镜像怎么办呢?
我们可以在主机1上push镜像到镜像仓库中,然后在主机2上pull把镜像拉下来使用,这种方式就显得比较麻烦,假如我只是测试用的,在一台主机上做好镜像后在另一台主机上跑一下就行了,没必要推到仓库上然后又把它拉到本地来。
此时我们可以在已有镜像的基础上把镜像打包成一个压缩文件,然后拷贝到另一台主机上将其导入,这就是镜像的导入和导出功能。
docker中我们使用docker save进行导出,使用docker load进行导入。
在已生成镜像的主机上执行docker save导出镜像
- [root@yj ~]# docker save -o myimages.gz servicestt/b1
- [root@yj ~]# ls
- anaconda-ks.cfg myimages.gz pass
- [root@yj ~]# scp myimages.gz root@192.168.47.136:/root
- The authenticity of host '192.168.47.136 (192.168.47.136)' can't be established.
- ECDSA key fingerprint is SHA256:btx2dSz90l/nMB41dSXH0DVPsBDudqSrCLbIIHMRNM4.
- Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
- Warning: Permanently added '192.168.47.136' (ECDSA) to the list of known hosts.
- root@192.168.47.136's password:
- myimages.gz
在另一台没有镜像的主机上执行docker load导入镜像
- [root@my ~]# docker load -i myimages.gz
- Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
- Error: stat myimages.gz: no such file or directory
- [root@my ~]# ls
- anaconda-ks.cfg apr-1.6.5.tar.bz2 httpd-2.4.54.tar.bz2
- apr-1.6.5 apr-util-1.6.1.tar.bz2 myimages.gz
- [root@my ~]# docker load -i myimages.gz
- Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
- Getting image source signatures
- Copying blob bf776f0c3d77 done
- Copying blob 01fd6df81c8e done
- Copying blob 5381ff491e6c done
- Copying config 51ba93864e done
- Writing manifest to image destination
- Storing signatures
- Loaded image(s): localhost/servicestt/b1:v0.2
- [root@my ~]# docker images
- Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
- REPOSITORY TAG IMAGE ID CREATED SIZE
- localhost/servicestt/b1 v0.2 51ba93864e4a 5 hours ago 1.47 MB

在拉取的centos镜像容器中搭建httpd服务
- [root@yj ~]# docker search centos
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- centos The official build of CentOS. 7270 [OK]
- [root@yj ~]# docker pull centos
- Using default tag: latest
- latest: Pulling from library/centos
- a1d0c7532777: Pull complete
- Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
- Status: Downloaded newer image for centos:latest
- docker.io/library/centos:latest
- [root@yj ~]# docker images
- centos latest 5d0da3dc9764 10 months ago 231MB
- [root@my yum.repos.d]# docker run -dit --name b1 centos
- 403c104037cfcda91cc807fb29e9283a81ce4d94a4dba798c9797ee2aff5a37b
- [root@my yum.repos.d]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 403c104037cf centos "/bin/bash" 5 seconds ago Up 5 seconds b1

进入容器
- [root@my yum.repos.d]# docker exec -it b1 /bin/bash
- [root@403c104037cf yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 100 2495 100 2495 0 0 4392 0 --:--:-- --:--:-- --:--:-- 4392
- [root@403c104037cf yum.repos.d]# ls
- CentOS-Base.repo
- //修改下阿里云云主机
- [root@403c104037cf yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
-
- //下载环境工具
- 创建apache用户组
- [root@localhost ~]# useradd -r -M -s /sbin/nologin apache
- [root@localhost ~]# id apache
- uid=994(apache) gid=991(apache) groups=991(apache)
- 安装依赖包
- yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++

分别预编译安装三个软件包
- [root@my yum.repos.d]# docker exec -it b1 /bin/bash
- [root@403c104037cf yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 100 2495 100 2495 0 0 4392 0 --:--:-- --:--:-- --:--:-- 4392
- [root@403c104037cf yum.repos.d]# ls
- CentOS-Base.repo
- //修改下阿里云云主机
- [root@403c104037cf yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
-
- //下载环境工具
- 创建apache用户组
- [root@localhost ~]# useradd -r -M -s /sbin/nologin apache
- [root@localhost ~]# id apache
- uid=994(apache) gid=991(apache) groups=991(apache)
- 安装依赖包
- yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++

apr
- [root@localhost apr-1.6.5]# vi configure
- # $RM "$cfgfile" //将此行加上注释,或者删除此行
- ......
- [root@localhost apr-1.6.5]# ./configure --prefix=/usr/local/apr
- [root@localhost apr-1.6.5]# make && make install
apr-util
- ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
- make && make install
httpd
- 解压httpd-2.4.54.tar.bz2
- [root@http ~]#tar xf httpd-2.4.54.tar.bz2
- [root@403c104037cf httpd-2.4.54]# ./configure --prefix=/usr/local/apache --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
- //预编译
- make && make install
安装完成
在容器中编写脚本,并于启动apache
- [root@403c104037cf ~]# cd /usr/local/apache/
- [root@403c104037cf apache]# ls
- bin cgi-bin error icons logs manual
- build conf htdocs include man modules
- [root@403c104037cf apache]# cd conf/
- [root@403c104037cf conf]# vi httpd.conf
- # ServerName www.example.com:80 //取消注释
- [root@403c104037cf conf]# /usr/local/apache/bin/httpd
- [root@403c104037cf conf]# ss -antl //启动80端口
- State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
- LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
//供参考
- [root@403c104037cf conf]# /usr/local/apache/bin/httpd
- 这种httpd启动方式虽然可以成功,但生成的镜像放在另一台终端创建的容器中却一直启动不了
-
- //验证
- [root@my src]# docker commit -a 'lty <1@2.com>' -c 'CMD ["/usr.local/apache/bin/httpd"]' -p b1 centos-httpd:v1
- sha256:a2f286fdc421fcd4d056cf39e74c9e2c124789ff31cc32b7b4bd681810303230
- [root@my src]# docker images | grep centos-httpd
- centos-httpd v1 a2f286fdc421 19 seconds ago 749MB
- [root@my src]# docker run -d -it --name http1 centos-httpd:v1
- a21f547b14612940d5d7cf8cd860a8e6f2f39d1fc23de88b2fe5878cdb6b3b38
- [root@my src]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- a21f547b1461 centos-httpd:v1 "/usr.local/apache/b…" 24 seconds ago Created http1
- [root@my src]# docker start http1
- Error //报错
**(一)**
在容器中中创建一个脚本
//关闭进程
- [root@403c104037cf apr-util-1.6.1]# pkill httpd
- [root@403c104037cf apr-util-1.6.1]# ss -antl
- State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
- [root@403c104037cf ~]# vi httpd.sh
- # !/bin/bash
- /usr/local/apache/bin/httpd
- sleep 5d //为了防止在后台运行,sleep固定运行在前台运行五天
- [root@403c104037cf ~]# chmod +x httpd.sh 给脚本执行权限
另一台终端中
- [root@my src]# docker commit -a 'lty <1@2.com>' -c 'CMD ["/root/httpd.sh"]' -p b1 centos-httpd:v2
- sha256:d6a946ada2477ca61c9c0494ad765d90a34e63321a75f6f9f9741ed9fecf93b9
- [root@my src]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- centos-httpd v2 d6a946ada247 55 seconds ago 940MB
- [root@my src]# docker run -d -it --name web1 centos-httpd:v2
- 10c211f0ed1e6970567c6fd43c741fd06c0b7948d08dd17ae12ceba68e3972b7
- //可以发现在创建容器后就处于运行状态了
- [root@my src]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 10c211f0ed1e centos-httpd:v2 "/root/httpd.sh" 2 minutes ago Up 2 minutes web1
- [root@my src]# docker inspect web1
- "Gateway": "172.17.0.1",
- "IPAddress": "172.17.0.3",
- //可见自己搭建的镜像使用后可以成功访问
- [root@my src]# curl 172.17.0.3
- <html><body><h1>It works!</h1></body></html>

(二)方法
- //这里的-D 指定的是本来存放在后台的命令却放在前台去运行
- [root@my src]# docker commit -a 'lty <1@2.com>' -c 'CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]' -p b1 centos-httpd:v3
- sha256:feff4b0fd2bc264c5d4ce576e2baff673eff62c64b16c6713e27091e4dfb567a
- [root@my src]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- centos-httpd v3 feff4b0fd2bc 26 seconds ago 940MB
- centos-httpd v2 d6a946ada247 16 minutes ago 940MB
- <none> <none> 66c9c9c06a38 33 minutes ago 940MB
- centos latest 5d0da3dc9764 10 months ago 231MB
- [root@my src]# docker run -d -it --name web2 centos-httpd:v3
- 1b44b2a7f099ded02e9fae036a7ff72837c086f7548483b32140513301ea5009
- [root@my src]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 1b44b2a7f099 centos-httpd:v3 "/usr/local/apache/b…" 6 seconds ago Up 6 seconds web2
接下来做一个80端口映射就完成了
- [root@my src]# docker run -d -it --name web3 -p 80:80 centos-httpd:v3
- fd0feaedc5693d6dff94ea91d313cc9ad94da8b342ced0ac5824d96232d2b656
- [root@my src]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- fd0feaedc569 centos-httpd:v3 "/usr/local/apache/b…" About a minute ago Up 58 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web3
- State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
- LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
- LISTEN 0 128 0.0.0.0:80
- [root@my src]# curl 192.168.47.136
- <html><body><h1>It works!</h1></body></html>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。