Py学习  »  docker

Docker实战学习笔记(附源码)

Ms08067安全实验室 • 3 年前 • 320 次点击  

出品|MS08067实验室(www.ms08067.com)

本文作者:大方子(Ms08067实验室核心成员)

大方子微信(欢迎骚扰交流):



目录

  • 守护方式启动容器

  • 容器交互 开始、停止、重启、查看容器输出、查看当前的容器

  • 容器中执行命令

  • 命名空间

  • 容器标识

  • 检查容器元数据

  • 容器的连接

  • 容器的环境变量

  • 只读文件系统

  • 持久化容器

  • 使用init和supervisor进程维持容器的运行状态

  • 清理容器

  • Docker Hub的使用

  • Docker 镜像

  • 持久化存储和卷间状态共享

  • Docker的网络

    • closed容器

    • Bridged容器

    • 自定义DNS解析

    • 开放对容器的访问

    • 跨容器通信

    • Joined容器

    • Open容器

    • 跨容器依赖

      • 容器链接

  • Docker Compose

    • docker-compose 命令

  • 在镜像中打包软件

    • 从容器构建镜像

    • 审查文件系统的改动

    • 可配置的镜像属性

    • 镜像体积和层数限制

    • 导出和导入压缩文件系统

  • 构建自动化和高级镜像设置

    • 指令解析

  • 软件分发



帮助

# 显示Docker工具的基本用法docker help# 显示指定命令的使用方法docker help cp

守护方式启动动容器

# 以守护的方式运行(后台运行)# ‐‐detach 或 ‐ddocker run ‐‐detach ‐‐name web nginx:latest

容器交互

# ‐‐interactive 或‐i 保持标准输入流# ‐‐tty 或 ‐t 为容器分配一个虚拟终端# 输入exit退出shell,容器也会停止工作# 若使用了‐‐tty。可以【Ctrl】+【P】+【Q】在退出shell的情况下容器不会停止工作docker run ‐‐interactive ‐‐tty ‐‐link web:web ‐‐name web_test busybox:latest /bin/sh

开始、停止、重启、查看容器输出、查看当前的容器

docker start [容器名称|容器ID]docker stop [容器名称|容器ID]docker restart [容器名称|容器ID]# 加上‐f 可以只需跟踪日志的变化docker logs [容器名称|容器ID]docker ps# 创建但不启动容器docker create nginx

容器中执行命令

# 运行指定命令docker exec [容器名称|容器ID] 命令# 创建时运行命令docker run ‐d ‐‐name namespaceA busybox:latest /bin/bash ‐c "sleep 30000"

命名空间

# 与物理机共享PID命名空间 ‐‐pid hostdocker run ‐‐pid host busybox:latest ps

容器标识

# ‐‐cidfile 把容器ID写入物理机的文件中# 如果CID文件存在,Docker不会创建新的容器docker create ‐‐cidfile /tmp/web.cid nginx# 显示完整的容器IDdocker ps ‐‐no‐trunc

检查容器元数据

# 查看容器是否运行 运行为True 停止为Falsedocker inspect ‐‐format "{{.State.Running}}" web

容器的连接




    
# ‐‐link 容器名:别名docker run ‐it ‐‐name agent ‐‐link web:insideweb

容器的环境变量

# 传递环境变量# ‐‐env 或 ‐edocker run ‐d ‐‐name wpdb ‐e MYSQL_ROOT_PASSWORD=ch2demo mysql:5docker run ‐‐env MY_ENVIRONMENT‐VAR="this is a test" busybox:latest env

只读文件系统

# 不运行更改容器所包含的文件,防止被攻击者破坏docker run ‐d ‐‐name wp ‐‐read‐only wordpress:4# 若想向只读文件系统写入内容,可以挂载存储卷docker run ‐d ‐‐name wp3 ‐v /run/lock/apache2 ‐v /run/apache2 ‐‐readonly wordpress:4

持久化容器

# ‐‐restart# 总共有三个参数 no,on‐failure,always# no为默认值,表示容器退出时,docker不自动重启容器# on‐failure表示,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃# ‐‐restart=on‐failure:3 [容器名]# always表示,只要容器退出,则docker将自动重启容器docker run ‐d ‐‐name backoff‐detector ‐‐restart always busybox date

使用init和supervisor进程维持容器的运行状态

# 查看容器运行着哪些进程# 显示主机为每一个容器中的进程所分配的PID# 利用top获取的进程PID,与在容器中运行的top获取的PID不同docker top lamp‐testdocker exec lamp‐test ps

清理容器

# 列出计算机上的所有容器docker ps ‐a# 删除容器docker rm wp# 删除前需要先停止容器docker stop wp# rm 可以增加‐f 来直接停止并清理容器# 与docker stop不同的是,‐f是发出SIG_KILL信号,而stop发出的是SIG_HUP信号# SIG_HUP停止前会让用户有准备时间,而SIG_KILL没有准备时间直接退出docker rm ‐f wp# 容器退出时自动进行删除 ‐‐rmdocker run ‐‐rm ‐‐name autoexittest busybox:latest echo hello world

Docker Hub的使用

# docker账号登录docker login# docker账号注销docker logout# 镜像的搜索docker search nginx

Docker 镜像

# Docker镜像的删除docker rmi nginx# 从替代注册服务器中下载镜像docker pull quay.io/dockerinaction/ch3_hello_registry:latest# 把镜像导出为文件docker save ‐o myfile.tar busybox:latest# 从文件中带入镜像docker load ‐i myfile.tar# Dockerfile安装镜像# 从当前目录的Dockerfile中创建镜像,并且标签为ch3_dockerfiledocker build ‐t ch3_dockerfile .# 从ch3_dockerfile中的Dockerfile创建镜像docker build ‐t diach3/dockerfile:latest ch3_dockerfile# 给ubuntu:15.10新增另外一个标签runoob/ubuntu:v3docker tag ubuntu:15.10 runoob/ubuntu:v3

持久化存储和卷间状态共享

# ‐v 挂载存储卷# ‐v 只有一个参数,把容器里面的/root/data 挂载到主机的/var/lib/docker/volumes的一个随机目录# 可以通过docker inspect ‐f "{{json .Mounts}}" 容器名 查看docker run ‐dit ‐v /root/data ‐‐name test busybox


    
# 把主机目录挂载到容器中去# 把主机的/root/docker‐practice/data目录挂载到容器的/root/data中去docker run ‐dit ‐v /root/docker‐practice/data:/root/data ‐‐name test busybox# 挂载另一个容器的存储卷# ‐‐volumes‐from# 这样test1容器的就会挂载test的存储卷,就是说test的存储卷发生变化test1里的/root/data也会发生变化# 使用这个参数需要注意3点 1. 无法更改源存储卷的挂载点 2. 无法更改源存储卷的权限定义 3.多个来源存储卷时,挂载点不能冲突,冲突则只选择后一个存储卷docker run ‐dit ‐‐volumes‐from test ‐‐name test1 busybox# 容器只能对挂载卷进行读操作# 增加:rodocker run ‐dit ‐v /root/docker‐practice/data:/root/data:ro ‐‐name test busybox# docker rm 清除容器的加上‐v# 否则卷的计数器不会-1(计数器为0时会删除这个卷)# 当所有的引起该卷的容器删除但是计数器不为0,docker是不会删除这个卷,那么这个卷就成了孤立卷docker rm ‐v test1# 从镜像中获取可用数据,可以在创建一个容器并挂载一个目录,把数据拷贝到挂载的目录中去# 然后通过docker inspect找到对应的目录。当然也可以通过‐v 宿主机目录:容器目录 的参数形式方便操作docker run ‐‐name dpvc ‐v /config dockerinaction/ch4_packed /bin/sh ‐c 'cp /packed*/config/'

Docker的网络

closed容器

# 增加‐‐net none 参数来创建closed容器docker run ‐‐rm ‐‐net none alpine:latest ip addr

Bridged容器

# docker默认创建的就是Bridged容器# 你可以省略‐‐net选项 或者 增加 ‐‐net bridgedocker run ‐‐rm ‐‐net bridge alpine:latest ip addr

自定义DNS解析

# 通过‐‐hostname选择,给容器设置一个主机名,使其在docker网络中能够通过主机名找到docker run ‐‐rm ‐‐hostname barker alpine:latest nslookup barker# 通过‐‐dns为容器设置DNS服务器# ‐‐dns[]可以为容器田间多个DNS服务器docker run ‐‐rm ‐‐dns 8.8.8.8 alpine:latest nslookup docker.com# 添加DNS查找域# 当该选项被设置时,在查询时,任何不包括已经顶级域名(比如.com或者.net)的主机名都会自动加上改后缀名# 以下这个命令回去解析registry.hub.docker.com的IP地址# 这个选项也可以在Docker后台进程启动时进行设置docker run ‐‐rm ‐‐dns‐search docker.com busybox:latest nslookup registry.hub# 自定义主机名到IP地址的映射关系# test会被解析到10.10.10.225# 该选项不能够再启动Docker后台进程时设置默认值docker run ‐‐rm ‐‐add‐host test:10.10.10.255 alpine:latest nslookup test# 这个选项可以被设置多次增加多个映射关系docker run ‐‐rm ‐‐add‐host docker.com:127.0.0.1 ‐‐add‐host test:10.10.10.2 alpine:latestcat /etc/hosts

开放对容器的访问

# 通过‐p参数让主机网络栈上的端口和容器端口之间建立映射关系# 这种格式会将容器端口绑定到所有主机接口的一个动态端口上docker run ‐p 333...# 这种格式会将一个具体的容器端口绑定到每一个主机接口的某一个具体的接口上# ‐p 宿主机端口:容器端口docker run ‐p 333:3333# 这种格式会将容器绑定到拥有指定IP地址的主机接口的动态端口上docker run ‐p 192.168.0.32::2222 ....# 这种格式会将容器端口绑定到拥有指定IP地址的注解接口的一个具体的端口上docker run ‐p 192.168.0.32:1111:1111 ....# ‐P 或者 ‐‐publish‐all# 能够将容器开放的端口都暴露出去docker run ‐d ‐‐name woolery ‐P dockerinaction/ch5_expose# 设置容器想要开放的端口,这个选项能够被设置多次,一个端口设置一次docker run ‐d ‐‐name philbin ‐‐expose 8000 ‐P dockerinaction/ch5_expose# 可以通过以下命令来查看容器端口的开放情况docker port philbin

跨容器通信

# 容器可以跟Docker虚拟网络接口上的其他容器进行通讯# 若要阻止容器之间的通讯,除非被显示允许,所有流量都不能跨容器通讯docker ‐d ‐icc=false

Joined容器

# 让多个容器共享一个网络栈# ‐‐net container:


    
[要加入的目标容器]docker runit ‐‐net container:brady alpine:latest

Open容器

# open容器对主机网络有完全的访问权限docker run ‐‐rm ‐‐net host alpine:latest ip addr

跨容器依赖

容器链接

# 将容器与另一个容器相链接# 目标容器必须正则允许# 链接是单向的,静态的,无传递性的网络依赖# 通过‐‐link链接imporantData容器并给这个容器取了db这个别名# 以后这个这个容器访问db就是访问imporantData容器docker run ‐d ‐‐name importantWebapp ‐‐link imporantData:db dockerinaction/ch5_webstart.sh ‐db tcp://db:3306

Docker Compose

docker-compose 命令

# 启动容器 ‐d 则会后台运行docker‐compose up# 查看容器状态docker‐compose ps# 停止容器docker‐compose stop# 停止容器中指定的服务docker‐compose stop 服务名# 删除容器,若省略‐v可能会使容器卷成为孤立docker‐compose ‐vfs rm# 查看容器日志,后面可加服务名查看指定服务,不加查看全部docker‐compose logs [服务名]# 服务源码发生变化时,重建服务。后面也可以跟服务名重建指定服务名docker‐compose build [服务名]

在镜像中打包软件

从容器构建镜像

# 把现有容器打包成镜像# ‐a 为新镜像指定作者的信息# ‐m 设置关于提交的信息docker commit [容器名] [镜像名]docker commit ‐m "Set CMD git" ‐a 'dfz@qq.com' cmd‐git ubuntu‐git# 配置容器的入口点# 容器运行后默认执行ls命令docker run ‐‐name cmd‐git ‐‐entrypoint "ls" ubuntu‐git# ubuntu‐ls镜像为添加了ls命令为入口点的镜像# 容器运行后执行 把/作为参数 运行“ls /”docker run ‐‐name cmd‐git1 ubuntu‐ls /# 为镜像配置标签# myuser/myfristrepo:mytag的镜像就会有myuser/mod_ubuntu的新标签docker commit mod_ubuntu myuser/myfristrepo:mytagdocker tag myuser/myfristrepo:mytag myuser/mod_ubuntu

审查文件系统的改动

# A表示添加,C表示修改,D表示删除docker diff [容器名]

可配置的镜像属性

# 配置容器的环境变量docker run ‐‐name rich‐image‐example ‐e ENV_EXAMPLE1=Rich busybox:latest

镜像体积和层数限制

# 镜像的文件操作,类似于PS的层一样,是一层一层往上加的(联合文件系统)# 一般文件系统的层数为42层# 可以用过histort来查看镜像的 层 历史# 可以通过导出再导入镜像来进行压缩,但是回丢失改动的历史信息docker history ubuntu‐git

导出和导入压缩文件系统

# 通过docker export ‐‐output(‐o)可以对容器进行导出docker export ‐‐output mod_ubuntu.tar mod_ubuntu# 显示归档的内容tar ‐tf mod_ubuntu.tar
# 将压缩格式的镜像进行导入docker import mod_ubuntu.tar

构建自动化和高级镜像设置

指令解析

# 源镜像FROM ubuntu:latest# 作者信息MAINTAINER "nzjdsds@qq.com"# 运行的命令Run apt‐get update && apt‐get install ‐y git


    
# 容器入口ENTRYPOINT ["git"]# 容器环境变量ENV APPROOT="/app"# 容器工作目录WORKDIR $APPROOT# 对外暴露的3333端口EXPOSE 3333# COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中COPY ["来源目录","目的目录"]# 挂载目录,但无法指定主机上对应的目录VOLUME ["/var/log"]
# 不要忘记最后面的. 不加‐f指定文件名 则默认使用Dockerfile# 在构建中,镜像的相同内容在之前配置会,则build时会使用缓存# 增加‐‐no‐cache来不适用缓存docker build ‐‐tag ubuntu‐git:auto .

软件分发

# 需要先使用docker login进行登录# 镜像要命名成/docker commit test/testdocker push/test


公众号回复“Docker命令”,打包下载所有命令,方便使用!




扫描下方二维码加入星球学习

加入后会邀请你进入内部微信群,内部微信群永久有效!

 

 

目前35000+人已关注加入我们


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/107046
 
320 次点击