支持运行多种Linux OS
原创
©著作权归作者所有:来自51CTO博客作者wx63f4605f9313d的原创作品,请联系作者获取转载授权,否则将追究法律责任
支持运行多种Linux OS
- 不同Linux发行版的区别主要就是rootfs。
base 镜像只是在用户空间与发行版一致,kernel 版本与发行版是不同的。
容器只能使用 Host 的 kernel,并且不能修改。
[root@docker-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@docker-01 ~]# uname -r
3.10.0-1160.el7.x86_64
[root@docker-01 ~]# docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
root@509a608daadd:/# /# cat /etc/issue
root@509a608daadd:/# cat /etc/issue
Ubuntu 20.04.3 LTS \n \l
root@509a608daadd:/# uname -r
3.10.0-1160.el7.x86_64
构建镜像
[root@docker-01 ~]# docker load -i centos7_6.tar
071d8bd76517: Loading layer 210.2MB/210.2MB
Loaded image: centos:latest
[root@docker-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest b4f91978e2cc 12 days ago 145MB
hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
centos latest 1e1148e4cc2c 4 years ago 202MB
docker commit
- docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤
• 运行容器。
• 修改容器。
• 将容器保存为新的镜像。
-it 参数的作用是以交互模式进入容器
[root@docker-01 ~]# docker run -it centos
[root@995f50a7adbb /]# yum -y install vim
//打开一个新的终端
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
995f50a7adbb centos "/bin/bash" 9 minutes ago Up 9 minutes adoring_noyce
[root@docker-01 ~]# docker commit adoring_noyce centos-with-vim
sha256:bfcb9b8f15f66e14ef364127390f61a84de92cbff1e5de196263d950b4de1a13
[root@docker-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-with-vim latest bfcb9b8f15f6 About a minute ago 465MB
httpd latest b4f91978e2cc 12 days ago 145MB
hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
centos latest 1e1148e4cc2c 4 years ago 202MB
//开启容器
[root@docker-01 ~]# docker run -it centos-with-vim
[root@91653e49be5c /]# vim
[root@91653e49be5c /]# exit
Dockerfile
[root@docker-01 ~]# mkdir ubantu/
[root@docker-01 ~]# cd ubantu/
[root@docker-01 ubantu]# vi dockerfile
[root@docker-01 ubantu]# pwd
/root/ubantu
[root@docker-01 ubantu]# ls
dockerfile
[root@docker-01 ubantu]# docker build -t ubuntu-with-vim .
[root@docker-01 ubantu]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-with-vim latest 1c52006bcfa2 10 minutes ago 184MB
centos-with-vim latest bfcb9b8f15f6 37 minutes ago 465MB
httpd latest b4f91978e2cc 12 days ago 145MB
hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB
ubuntu latest ba6acccedd29 19 months ago 72.8MB
centos latest 1e1148e4cc2c 4 years ago 202MB
- FROM (构建指令)
指定 base 镜像,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的镜像。FROM指令指定的base镜像可以是官方远程仓库中的,也可以位于本地仓库。
该指令有两种格式:
FROM
指定基础image为该image的最后修改的版本(latest)。
或者:
FROM :
指定基础image为该image的一个tag版本。
- MAINTAINER (构建指令)
格式:MAINTAINER
设置镜像的作者,可以是任意字符串。用于将image的制作者相关的信息写入到image中。当我们对该image执行
docker inspect命令时,输出中有相应的字段记录该信息。
现在已经被“LABEL maintainer=”取代
LABEL maintainer="berry <88103918@qq.com>"
- COPY (构建指令)
将文件从 build context 复制到镜像。
COPY 支持两种形式:
COPY src ... dest
COPY ["src", ... "dest"]
- ADD (构建指令)
与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
此指令用于复制新文件、目录或者远程URL地址添加到容器的指定 路径下,指令包含两种形式:
ADD ... ",... ""]
- ENV (构建指令)
设置环境变量,环境变量可被后面的指令使用,并在容器运行时保持。
格式:ENV
例如:
...
ENV PATH /usr/local/nginx/sbin:MY_VERSION
...
- EXPOSE (设置指令)
格式:EXPOSE /...]
可以指定TCP或UDP,默认是TCP
告诉Docker服务器暴露的端口号,供互联系统使用。
- VOLUME (设置指令)
格式:VOLUME [""]
将文件或目录声明为 volume。使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。我们会在容器存储部分详细讨论。
- WORKDIR (设置指令)
格式:WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
- RUN (构建指令)
在构建镜像过程中要指定执行的命令。
- CMD (设置指令)
容器启动时运行指定的命令。
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。
- ENTRYPOINT (设置指令)
设置容器启动时运行的命令。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。
- USER
USER指令用于指定容器执行程序的用户身份,默认是root用户。
使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
- HEALTHCHECK
容器健康状况检查命令
语法有两种:
- HEALTHCHECK [OPTIONS] CMD command
- HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[root@docker-01 ~]# mkdir nginx
[root@docker-01 ~]# cd nginx/
[root@docker-01 nginx]# ls
[root@docker-01 nginx]# pwd
/root/nginx
[root@docker-01 nginx]# vi dockerfile
[root@docker-01 nginx]# cat test.sh
#!/bin/bash
ss -anptl | grep 80 &> /dev/null
if [ $? -eq 0 ]
then
exit 0
else
exit 1
fi
//构建镜像
[root@docker-01 nginx]# docker build -t centos_nginx:v1 .
[root@docker-01 nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx v1 f0cd718a3d81 37 seconds ago 486MB
[root@docker-01 nginx]# docker history centos_nginx:v1
//运行镜像
[root@docker-01 nginx]# docker run -d centos_nginx:v1
f157bad76f39ca5a5667da5e3e3574ce5a23abccc228508ae8022d1da0b0a323
[root@docker-01 nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f157bad76f39 centos_nginx:v1 "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds (health: starting) 80/tcp thirsty_swartz
//运行新的容器,测试不健康检查
[root@docker-01 nginx]# docker run -d centos_nginx:v1 /bin/sh -c "while true; do sleep 1;done"
909f9c776e08a8f94ef04779a00f474094463e73159182457d61bcff97c09f05
[root@docker-01 nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
909f9c776e08 centos_nginx:v1 "/bin/sh -c 'while t…" 8 seconds ago Up 8 seconds (health: starting) 80/tcp youthful_dijkstra
f157bad76f39 centos_nginx:v1 "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes (healthy) 80/tcp thirsty_swartz
[root@docker-01 nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
909f9c776e08 centos_nginx:v1 "/bin/sh -c 'while t…" 33 seconds ago Up 32 seconds (unhealthy) 80/tcp youthful_dijkstra
f157bad76f39 centos_nginx:v1 "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes (healthy) 80/tcp thirsty_swartz
//通过docker指令得到指定容器id的健康状态
[root@docker-01 nginx]# docker inspect -f '{{.State.Health.Status}}' 909f9c776e08
unhealthy