Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。
基础知识
-
docker的架构图
docker 的register仓库默认在 https://hub.docker.com/
docker的架构图
-
镜像命令
1 2 3 4 5 6 7 8 9
# www.dmbetter.cn # 下载镜像 alpine 微型发行版本 docker image pull nginx:1.14-alpine # 列出镜像 docker image ls # 删除镜像 docker image rm nginx #第三方 docker pull quay.io/coreos/flannel
- 容器命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# www.dmbetter.cn # 创建容器 docker container create # 列出容器 docker container ls # 启动容器 docker container start # 停止容器 docker container stop # 强行停止容器 docker container kill # 创建并启动容器 docker container run # 删除容器 docker container rm # 暂停/取消暂停容器 docker container pause/unpause # 根据资源消耗排序容器 docker container top
docker run exit 退出
1 2 3 4 5 | # www.dmbetter.cn # --name 容器的名称 -t 开启终端 -i 交互 docker run --name b1 -it busybox:latest # -d 后台守护进程 docker run --name web1 -d nginx:1.14-alpine |
docker ps
1 2 3 4 5 | # www.dmbetter.cn # 查看当前启动的容器 docker ps # 查看所有的容器 docker ps -a |
docker start
1 2 3 | # www.dmbetter.cn # -i -a 开启终端 如果是进程可以不加 docker start -i -a b1 |
docker inspect 用于获取容器/镜像的元数据
docker exec 在容器中执行另外命令
1 2 | # www.dmbetter.cn docker exec -it redis1 /bin/sh |
docker logs 查看容器日志
1 2 | # www.dmbetter.cn docker logs web1 |
docker 事件状态 相关命令图udocker event state
镜像管理
基于容器制作镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # www.dmbetter.cn # step1 运行一个镜像 docker run --name b1 -it busybox # step2 一些自定义的配置 mkdir -p /data/html vi /data/html/index.html # step3 保持容器运行 重新打开一个窗口 或者后台运行 docker commit -p b1 #p 暂停容器 防止容器运行时生成一半文件 --pause # step4 查看生成的镜像 docker image ls # step5 打上标签 964.. 为image ID 一个镜像可以有多个标签 一个标签只有一个镜像 # 如果不是要推送到dockerhub 前面还需要加上镜像服务器地址 docker tag 964c8600c6bb leeway/httpd:v0.1-1 docker tag 964c8600c6bb leeway/httpd:latest docker tag 964c8600c6bb registry.cn-beijing.aliyuncs.com leeway/httpd:v0.1-1 # step6 可以删除镜像 docker image rm leeway/httpd:v0.1-1 |
详细版
-a 指定作者邮箱 -c 更改元数据? 列表内的是参数 CMD指运行容器时默认执行的命令
1 2 | # www.dmbetter.cn docker commit -a "leeway <wangttp@qq.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 leeway/httpd:v0.2 |
发布到docker hub
用户名需要和镜像名一致才能push 比如leeway/htttpd dockerhub 用户名也需要是leeway
1 2 3 4 5 6 7 8 9 | # www.dmbetter.cn # 首先要登陆到docker hub ->docker login [OPTIONS] [SERVER] docker login -u leeway -p xxxxx docker login -u leeway -p xxxxx registry.cn-beijing.aliyuncs.com # 推送 docker push leeway/httpd docker push registry.cn-beijing.aliyuncs.com/leeway/httpd # 登出 docker logout |
两台服务器共享镜像 镜像打包 docker save docker load
1 2 3 4 5 6 7 8 | # www.dmbetter.cn # 打包镜像 docker save -o myimages.gz leeway/httpd:latest leeway/httpd:v0.2 # 发送到另外一台服务器 scp myimages.gz yourip:/root/ # 登陆另一台服务器 # docker load docker load myimage.gz |
docker volumes 存储券
示意图
存储券的两种类型 一种是bind mount volume 指定 两边的文件路径 一种是manage volumes只指定容器内的地址 host主机的由容器自动创建。
- manage volumes docker 管理的券
1 | docker run --name b2 -it -v /data busybox |
- 绑定挂载券
-
1 2
# host 地址写在前面 --rm 关闭时删除 docker run --name b2 -it --rm -v /data/volumes/b2:/data busybox
docker inspect 指定查找某一项数据
1 2 3
# 外层{}代表数据结构 内层{} 代表根 . 代表根下的一个元素 docker inspect -f {{.Monunt}} b2 docker inspect -f {{.NetworkSettings.IPAddress}} b2
当两个或多个容器都挂载到宿主机的同一个目录时就相当于两个容器共享文件
1 2 3 4
#创建一个基础的容器 docker run --name infracon -it -v /data/infracon/volume/:/data/web/html busybox # 基于基础容器创建 一个nginx 容器 --network 加入到这个网络中 --volumes-from 共享相同的券 docker run --name nginx --network container:infracon --volumes-from infracon -it busybox
docker file
文档
From 基于哪个镜像 也可以写成 busybox@hashid1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
# 创建dockerfile 文件 首字母大写 vim Dockerfile # 内容 ⬇️ # Description: test image From busybox:latest MAINTAINER "leeway <wangttp@qq.com>" #LABEL maintianer="leeway <wangttp@qq.com>" # index.html 这个文件必须存在 且在Dockerfile同目录下 或者子目录 COPY index.html /data/web/html/ #只会复制目录下的文件 所以后面路径要补上目录名 加上/ 不然识别为文件 COPY yum.repos.d /etc/yum.repos.d/ #add 和copy类似 但是可以写url URL不会解压 如果是本地主机add 到镜像中 则会自动解压 ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/ # 工作目录 后续的命令会基于这个目录 WORKDIR /usr/local/src ADD http://nginx.org/download/nginx-1.15.2.tar.gz ./ # volume 只能指定 docker管理券 不能指定绑定挂载券 VOLUME /data/mysql #expose 用于为容器打开指定要监听的端口以实现与外部通信 不写协议默认是tcp 运行时加 -P(大写) 否则默认不暴露 EXPOSE 80/tcp #ENV 环境变量. ENV DOC_ROOT /data/web/html/ \ WEB_SERVER_PACKAGE = 'nginx.1.15.2' # 不要有空格 COPY index.html ${DOC_ROOT:-/data/web/html/} # 无值取后面的 #向环境变量赋值 在运行容器时 -e printenv 打印环境变量 docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE = 'nginx.1.15.1' tinyweb:v0.1 printenv # RUN 在build 的过程中执行命令 run 可以运行多次 建议用&& \写成 一条语句 RUN cd /usr/local/src && \ tar xf $(WEB_SERVER_PACAGE)
build
1
docker build -t tinyhttpd:v0.1-1 ./
1 2
#测试查看 docker run --name tinyweb1 --rm tinyhttpd:v0.1-1 cat /data/web/html/index.html
当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。例如:sh test.sh &
使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。该命令的一般形式为:nohup command &cmd 的命令在 docker run 的时候才会执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
FROM busybox LABEL maintainer='leeway <wangttp@qq.com>' app="httpd" ENV WEB_DOC_ROOT="/data/web/html/" RUN mkdir -p $WEB_DOC_ROOT && \ echo '<h1>Busybox httpd server</h1>' > ${WEB_DOC_ROOT}/index.html CMD /bin/httpd -f -h ${WEB_DOC_ROOT} #下面格式不会执行在shell 下 所以前面加了shell #CMD ["/bin/sh","-c","/bin/httpd","-f","-h /data/web/html"] docker build -t tindyhttpd:v0.2-2 ./ docker run --name tinyweb2 --rm -P tindyhttpd:v0.2-2 docker exec -it tinyweb2 /bin/sh
ENTRYPOINT 和 CMD 类似 CMD 的命令 可以在docker run 后面接命令覆盖 而 ENTRYPOINT 不会 而是相当于 补在 ENTRYPOINT 后面 如果同时定义 CMD 会当作参数传给ENTRYPOINT多数情况下ENTRYPOINT 相当于父进程 CMD 或传参数 相当于子进程
1 2 3
# 此时若在run 最后加命令 会覆盖 cmd 命令 CMD ["/bin/httpd","-f","-h /data/web/html"] ENTRYPOINT ["/bin/sh","-c"]
安全检测
HealthcheckARGS && ONBUILD
1 2 3 4 5 6
ARG author = "leeway <wangttp@qq.com>" LABEL maintainer${author} app="httpd" docker build -t tinyhttpd:v0.1-1 --build-arg author="lee <wangttp@qq.com>" ./ # 相当于一个触发器 当别人基于这个基础镜像build时会执行后面的 指令 首次制作的时候不会执行 ONBUILD ADD http.....