目录
一、docker镜像的制作
1、Docker Hub
2、Docker Hub 提供以下主要功能:
3、docker镜像的获取
4、镜像的生成
5、基于容器制作镜像
6、镜像的导入与导出
二、扩展题
1、apache安装
2、实例
3、启动的两种方法
多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。
那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。
Docker Hub 是一项基于云的注册表服务,允许您链接到代码存储库、构建映像并对其进行测试、存储手动推送的映像以及指向 Docker Cloud 的链接,以便将映像部署到主机。
它为容器映像发现、分发和更改管理、用户和团队协作以及整个开发管道中的工作流自动化提供了集中式资源。
图像存储库
从社区和官方库中查找和提取映像,以及管理、推送到您有权访问的私有映像库以及从中拉取映像库。
自动构建
在对源代码存储库进行更改时自动创建新映像。
网络钩子
Webhooks 是自动构建的一项功能,可让您在成功推送到存储库后触发操作。
组织
创建工作组以管理对映像存储库的访问。
GitHub 和 Bitbucket 集成
将中心和 Docker 映像添加到当前工作流。
要从远程注册表(例如您自己的 Docker 注册表)获取 Docker 映像并将其添加到本地系统,请使用 docker pull 命令:
```
# docker pull
```
是一个在 TCP 上提供 docker 分发服务的主机(默认值:5000)
一起 识别由 注册表控制的特定映像
一些注册表也支持原始;对于这些, 是可选的
但是,当它被包括在内时,提供的附加层次结构级别对于区分具有相同图像是有用的
层次结构的附加级别
Namespace | |
---|---|
组织 | redhat/kubernetes, google/kubernetes |
登录(用户名) | Alice/application, bob/application |
角色 | 开发/数据库,测试/数据库,生产/数据库 |
镜像的生成途径:
Dockerfile
基于容器制作
Docker Hub 自动构建
根据容器的更改创建新映像
用法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项 | 违约 | 描述 |
---|---|---|
—作者, -a | 作者(例如,“约翰·汉尼拔·史密斯 [email protected]") | |
-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
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 ' -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 [email protected]:/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.
[email protected]'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 <[email protected]>' -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 <[email protected]>' -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
It works!
(二)方法
//这里的-D 指定的是本来存放在后台的命令却放在前台去运行
[root@my src]# docker commit -a 'lty <[email protected]>' -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
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
It works!