dockers01
1.1 Docker 镜像说明
1.1.1 docker 镜像中没有内核
从镜像大小上面说,一个比较小的镜像只有1MB多点,或几MB,而内核文件需要几十个MB因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机内核,而镜像本身则只是提供相应的rootfs(跟文件管理系统) ,也就是系统正常运行的必须是用户空间的文件系统,比如:/dev/,/proc/,/bin/ ,/etc./ 等目录, 容器当中/boot 目录是空的,而/boot 当中保存的就是与内核相关的文件和目录。
root@Ubuntu1804-101:~# docker run -it centos bash
[root@2a49b22a8fed /]# cd /boot/
bash: cd: /boot/: No such file or directory
[root@2a49b22a8fed /]#
1.1.2 为什么没有内核
由于容器启动和运行过程中直接使用了宿主机的内核,不会直接调用物理硬核,所以也不会设计到硬件驱动,因此也无需容器内拥有自己的内核和驱动,而如果会虚拟机技术,对应每个虚拟机都有自己独立的内核、
1.1.3 容器中的程序后台运行会导致此容器启动后会立即退出
Docker容器如果希望启动后能持续运行,就必须有一个能前台持续运行的进程,如果在容器中启动传统的服务,如:httpd,php-fpm等均为后台进程模式运行,就导致 docker 在前台没有运行的应用,这样的容器启动后会立即退出。所以一般会将服务程序以前台方式运行,对于有一些可能不知道怎么实现前台运行的程序,只需要在你启动的该程序之后添加类似于 tail ,top 这种可以前台运行的程序即可. 比较常用的方法,如 tail -f /etc/hosts 。
#httpd
ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]
#nginx
ENTRYPOINT [ "/usr/sbin/nginx", "-g", "daemon off;" ]
#用脚本运行容器
cat run_haproxy.sh
1.1.4 docker 镜像生命周期
1.1.5 制作镜像方式
Docker 镜像制作类似类似于虚拟机的镜像(模式)制作,即按照公司的实际业务需求将需要安装的软件,相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作,
Docker 的镜像制作分为手动制作(基于容器)和自动制作(基于dockerfile)企业通常都是基于Docker 制作镜像
docker commit #通过修改现有容器,将之手动构建为镜像
docker build #通过docker 文件,批量构建为镜像。
1.2 将现有容器通过docker commit 手动构建镜像
1.2.1 基于容器手动制作镜像步骤
docker commit 格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
#选项
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@ateam.com作者(例如,“约翰·汉尼拔·史密斯<hannibal@ateam.com>”)
-c, --change list Apply Dockerfile instruction to the created image 对创建的映像应用Dockerfile指令
-m, --message string Commit message 提交消息 可以添加我这次做镜像 做了那些修改
-p, --pause Pause container during commit (default true)在提交期间暂停容器(默认为true)
#说明:
制作镜像和CONTAINER状态无关,停止状态也可以制作镜像 运行的容器和停止的运行容器都是可以制作镜像的
如果没有指定[REPOSITORY[:TAG]],REPOSITORY和TAG都为<none>
提交的时候标记TAG号: 生产当中常用,后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器
基于容器手动制作镜像步骤具体如下:
-
下载一个系统的官方镜像(基础镜像),如Centos 或者 Ubuntu
-
基于基础镜像启动一个容器,并进入到容器
-
在容器里面做配置操作
-
安装基础命令
-
配置运行环境
-
安装服务和配置服务
-
放业务长须代码
-
-
提交为一个新的镜像docker commit
-
基于自己的镜像创建容器并测试
1.2.2 实战案例:基于busybox 制作httpd 镜像
[root@ubuntu1804 ~]#docker run -it --name b1 busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # echo httpd website in busybox >index.html
/ # httpd -f
#访问测试
root@Ubuntu1804-101:~# curl 172.17.0.2
httpd website in busybox
#或者
/ # mkdir /data/html -p
/ # echo hhhh > /data/html/index.html
/ # cat /data/html/index.html
hhhh
/ # httpd -h /data/html/
#访问测试
/ # httpd --help
BusyBox v1.32.0 (2020-06-27 00:20:57 UTC) multi-call binary
Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM]
[-h HOME]
or httpd -d/-e/-m STRING
Listen for incoming HTTP requests
-i Inetd mode 插入模式
-f Don't daemonize 不要daemonize
#前台方式进行
-v[v] Verbose #显示访问日志
-p [IP:]PORT Bind to IP:PORT (default *:80) [IP:]PORT绑定IP:PORT(默认*:80)
-u USER[:GRP] Set uid/gid after binding to port USER[:GRP]绑定端口后设置uid/gid
-r REALM Authentication Realm for Basic Authentication REALM认证基本认证的域
-h HOME Home directory (default .)
#存放网页配置的文件目录
-c FILE Configuration file (default {/etc,HOME}/httpd.conf) 配置文件(default {/etc,HOME}/httpd.conf) #指定dockerfile 的相关语法
-m STRING MD5 crypt STRING STRING MD5密码加密字符串
-e STRING HTML encode STRING HTML编码
-d STRING URL decode STRING URL解码
/ # exit
#格式1
[root@ubuntu1804 ~]#docker commit -a "liangxiaoyu" -c 'CMD /bin/httpd -f -h /data/html' -c "EXPOSE 80" b1 httpd-busybox:v1.0
#格式2
[root@ubuntu1804 ~]#docker commit -a "liangxiaoyu" -c 'CMD ["/bin/httpd", "-f", "-v","-h", "/data/html"]' -c "EXPOSE 80" b1 httpdbusybox:v1.0
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED docekr
SIZE
httpd-busybox v1.0 e7883146c119 6 minutes ago
1.22MB
[root@ubuntu1804 ~]#docker run -d -P --name httpd01 httpd-busybox:v1.0
ce95174c6385392b9699d12d1a86d7f81bc4dde1400a071ce17d9c78d905cb12
[root@ubuntu1804 ~]#docker port httpd01
80/tcp -> 0.0.0.0:32783dock
[root@ubuntu1804 ~]#docker inspect -f "
{{.NetworkSettings.Networks.bridge.IPAddress}}" httpd01
172.17.0.2
#对应格式1
[root@ubuntu1804 ~]#docker inspect -f "{{.Config.Cmd}}" httpd01
[/bin/sh -c /bin/httpd -f -h /data/html]
#对应格式2
[root@ubuntu1804 ~]#docker inspect -f "{{.Config.Cmd}}" httpd01
[/bin/httpd -f -h /data/html]
[root@ubuntu1804 ~]#docker exec -it httpd01 sh
/ # pstree -p
httpd(1)
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /bin/httpd -fv -h /data/html
7 root 0:00 sh
13 root 0:00 ps aux
/ #
[root@ubuntu1804 ~]#curl 172.17.0.2
httpd website in busybox
[root@ubuntu1804 ~]#curl 127.0.0.1:32783
httpd website in busybox
#再次制作镜像v2.0版
[root@ubuntu1804 ~]#docker commit -a "wang<root@wangxiaochun.com>" b1 httpdbusybox:v2.0
[root@ubuntu1804 ~]#docker run -d --name web2 -p 81:80 httpd-busybox:v2.0 /bin/httpd -fv -h /data/html
c47bce0de75dcdf88266467accbe0a119190999c23cec32d6af8b8500aed96d4
#不能拿本机做验证哈
1.2.3 实战案例:基于官方镜像生成的容器制作tomcat 镜像
1.2.3.1 下载官方的tomcat 镜像并运行
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
[root@ubuntu1804 ~]#docker run -d -p 8080:8080 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
e9afc4f90ab0: Pull complete
989e6b19a265: Pull complete
af14b6c2f878: Pull complete
5573c4b30949: Pull complete
fb1a405f128d: Pull complete
612a9f566fdc: Pull complete
4226f9b63dac: Pull complete
cb8bfe875d7f: Pull complete
5aa366608b6d: Pull complete
4b7c9018ca5f: Pull complete
Digest: sha256:46456ccf216f2fde198844d5c7d511f60e3ffc2ea3828e0cce9a2eed566e48e2
Status: Downloaded newer image for tomcat:latest
6fcc5f7c1c7ce7be0b12007e310fc044e1077d489e1292b22621de55e302c455
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
6fcc5f7c1c7c tomcat "catalina.sh run" 42 seconds ago
Up 40 seconds 0.0.0.0:8080->8080/tcp focused_wilbur
[root@ubuntu1804 ~]#curl -I 127.0.0.1:8080
HTTP/1.1 404
Content-Type: text/html;charset=utf-8
Content-Language: en
Transfer-Encoding: chunked
Date: Mon, 20 Jul 2020 15:33:21 GMT
1.2.3.1 修改容器
[root@ubuntu1804 ~]#docker exec -it 6fcc5f7c1c7c bash
root@6fcc5f7c1c7c:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp
webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib
webapps work
root@6fcc5f7c1c7c:/usr/local/tomcat# ls webapps 一般页面是不存在的 需要我们创建
root@6fcc5f7c1c7c:/usr/local/tomcat# ls webapps.dist/ 但是官方给我们准备了 我们需要改名字 或者复制就行了
ROOT docs examples host-manager manager
root@6fcc5f7c1c7c:/usr/local/tomcat# cp -a webapps.dist/* webapps/
#-a 保留属性
root@6fcc5f7c1c7c:/usr/local/tomcat# ls webapps/
ROOT docs examples host-manager manager
root@6fcc5f7c1c7c:/usr/local/tomcat# exit
exit
[root@ubuntu1804 ~]#curl -I 127.0.0.1:8080
-I #只显示文档信息
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 20 Jul 2020 15:34:24 GMT
1.2.3.2 提交镜像
[root@ubuntu1804 ~]#docker commit -m "add webapps app" -a "wangxiaochun" 6fcc5f7c1c7c tomcat:10.0.13-v1
sha256:b8d669ebf99e65d5ed69378d0d53f054e7de4865d335ab7aa0a7a5508e1369f7
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
tomcat 9.0.37-v1 b8d669ebf99e 4 seconds ago
652MB
tomcat latest df72227b40e1 3 days ago
647MB
[root@ubuntu1804 ~]#docker history tomcat:9.0.37-v1
IMAGE CREATED CREATED BY
SIZE COMMENT
b8d669ebf99e 14 minutes ago catalina.sh run
4.84MB add webapps app
df72227b40e1 3 days ago /bin/sh -c #(nop) CMD ["catalina.sh"
"run"] 0B
<missing> 3 days ago /bin/sh -c #(nop) EXPOSE 8080
0B
<missing> 3 days ago /bin/sh -c set -e &&
nativeLines="$(catalin… 0B
<missing> 3 days ago /bin/sh -c set -eux;
savedAptMark="$(apt-m… 20MB
<missing> 3 days ago /bin/sh -c #(nop) ENV
TOMCAT_SHA512=077c3e6… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
TOMCAT_VERSION=9.0.37 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV TOMCAT_MAJOR=9
0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
GPG_KEYS=05AB33110949… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
LD_LIBRARY_PATH=/usr/… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
TOMCAT_NATIVE_LIBDIR=… 0B
<missing> 3 days ago /bin/sh -c #(nop) WORKDIR
/usr/local/tomcat 0B
<missing> 3 days ago /bin/sh -c mkdir -p "$CATALINA_HOME"
0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
PATH=/usr/local/tomca… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
CATALINA_HOME=/usr/lo… 0B
<missing> 3 days ago /bin/sh -c #(nop) CMD ["jshell"]
0B
<missing> 3 days ago /bin/sh -c set -eux; dpkgArch="$(dpkg
--pr… 323MB
<missing> 3 days ago /bin/sh -c #(nop) ENV
JAVA_URL_VERSION=11.0… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
JAVA_BASE_URL=https:/… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV
JAVA_VERSION=11.0.8 0B
<missing> 5 weeks ago /bin/sh -c { echo '#/bin/sh'; echo 'echo
"$J… 27B
<missing> 5 weeks ago /bin/sh -c #(nop) ENV
PATH=/usr/local/openj… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ENV
JAVA_HOME=/usr/local/… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8
0B
<missing> 5 weeks ago /bin/sh -c set -eux; apt-get update;
apt-g… 11.1MB
<missing> 5 weeks ago /bin/sh -c apt-get update && apt-get
install… 146MB
<missing> 5 weeks ago /bin/sh -c set -ex; if ! command -v gpg
> /… 17.5MB
<missing> 5 weeks ago /bin/sh -c apt-get update && apt-get
install… 16.5MB
<missing> 5 weeks ago /bin/sh -c #(nop) CMD ["bash"]
0B
<missing> 5 weeks ago /bin/sh -c #(nop) ADD
file:1ab357efe422cfed5… 114MB
[root@ubuntu1804 ~]#docker inspect tomcat:9.0.37-v1 |tail -n20
"Type": "layers",
"Layers": [
"sha256:8803ef42039dcbe936755e9baae4bb7b19cb0fb6a438eb3992950cd0afef8e4f",
"sha256:c2c789d2d3c5fc15428921b5316a63907d8c312c5508cbac9a704bd30bcc740d",
"sha256:527ade4639e08d1b2ba9d0d46f3b43433310a2e8674ae808aeef5502b099ff3c",
"sha256:2e5b4ca91984c19a75bad687aedebf02609511a033aa0d3d15ac915593279718",
"sha256:f5181c7ef9028578eb0040a0051ce940c3f9ba62a51d3eb02ad52c3724db3e9b",