Skip to content

Instantly share code, notes, and snippets.

@HGladiator
Last active March 8, 2018 03:40
Show Gist options
  • Save HGladiator/4cf45e8e206be2015f3d6c76bf9b8bfd to your computer and use it in GitHub Desktop.
Save HGladiator/4cf45e8e206be2015f3d6c76bf9b8bfd to your computer and use it in GitHub Desktop.
Docker

Docker

三个组件分别是:

  1. Docker Client 是用户界面,它支持用户与Docker Daemon之间通信。
  2. Docker Daemon运行于主机上,处理服务请求。
  3. Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。 三个基本要素分别是:
  4. Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
  5. Docker Images是一个只读模板,用来运行Docker容器。
  6. DockerFile是文件指令集,用来说明如何自动创建Docker镜像。

没有镜像名和标签的是镜像叫做虚悬镜像,是被同名镜像上传替代掉了名字。

Docker 容器的基本用法

  1. docker ps或者docker container ls显示正在运行的容器
  2. docker ps -a 显示所有容器
  3. docker kill $(docker ps -q)停止所有正在运行的容器
  4. docker rm -f $(docker ps -qa)或者docker container prune 清理批量所有的容器
  5. docker rm -lv CONTAINER 删除容器时 清理link 和volume
  6. docker rmi $(docker images -qf "dangling=true")或者docker image prune 清理所有悬挂(<none>)镜像
  7. docker ps -a --filter 'exited=0' 清理退出状态为0的容器
  8. docker volume prune 清理未使用的数据卷
  9. docker volume ls 查看数据卷
  10. docker inspect --format '{{.State.Pid}} <CONTATNER ID or NAME> 获取某个容器的PID信息
  11. docker inspect --format '{{ .NetworkSettings.IPADRESS}}' <CONTATNER ID or NAME>获取某个容器的IP地址
  12. docker start /stop /rm 47d62ca63a50启动,停止,删除某个容器,容器ID,前几个特有的字符也行,不跟其他容器ID相同就可以
  13. Ctrl+PandCtrl+Q退出shell到后台运行, docker exec -it $ID /bin/bash 再次进入shell
  14. 清理容器失败的时候,可以通过重启Docker Daemon来解决
    # systemd
    sudo systemctl restart docker.service
    # initd
    sudo service docker restart
    

Dockerfile指令

  1. copy 复制文件 add仅限于自动解压文件时使用

  2. 构建时尽量把语句写在一个run里,可以清除不需要的

  3. FROM scratch 从一个空的镜像开始创建

  4. 容器是进程,cmd 是指定默认的容器主进程的启动命令的,容器中的应用都应该以前台执行,容器内没有后台服务的概念,对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程儿存在的,主进程退出,容器就失去了存在的意义,从而推退出,其他的辅助进程不是它需要关心的东西,主进程退出了,容器自然就退出了。

  5. ENTRYPOINT 在指定容器启动程序及参数,和run 一样的指令

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get update
sudo apt-get install docker-ce

sudo docker run hello-world

制作镜像遵循原则

整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括尽量选取满足需求但较小的基础系统镜像, 例如大部分时候可以选择debian:wheezy 或debian:jessie 镜像,仅有不足百兆大小; 清理编译生成文件、安装包的缓存等临时文件; 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖; 从安全角度考虑,应用要尽量使用系统的库和依赖; 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值; 使用Dockerfile 创建镜像时候要添加.dockerignore 文件或使用干净的工作目录。

Docker默认网络和自定义bridge网络的差异

#命令
docker network create    Create a network
docker network connect   Connect a container to a network
docker network ls      List networks
docker network rm    Remove one or more networks
docker network disconnect   Disconnect a container from a network
docker network inspect    Display detailed information on one or more networks

#查看这三个容器的网络情况
docker network inspect container1 # docker0
docker network inspect container2 # docker0, mynet
docker network inspect container3 # mynet

# 进入container2内部
docker attach container2
ping -w 4 container3 # 可访问  
ping -w 4 container1 # 不可访问  
ping -w 4  172.17.0.2  # 可访问container1的IP  
# Ctrl+P+Q退出容器,让container2以守护进程运行


#  运行容器使用自定义网络,同时使用--link链接尚不存在的container5容器  
docker  run  --net=mynet  -itd  --name=container4  --link  container5:c5  busybox  
#  创建容器container5  
docker  run  --net=mynet  -itd  --name=container5  --link  container4:c4  busybox  
#  虽然是相同容器,但是在不同的网络环境连接中可以不同的alias链接  
docker  network  connect  --link  container5:foo  local_alias_net  container4  
docker  network  connect  --link  container4:bar  local_alias_net  container5


docker run  --net=mynet -itd --name=container6 --net-alias app busybox
docker network connect --alias scoped-app local_alias_net container6
docker run  --net=isolated_nw -itd --name=container7 --net-alias app busybox
docker network connect --alias scoped-app local_alias_net container7  
# 在container4中
docker attach container4
ping app # 访问container6的IP  
# 从container4中以守护进程运行退出:Ctrl+P+Q
docker stop container6
docker attach container4
ping app # 访问的container7的IP

在默认网络中使用link(legency link),有如下功能:

  • 使用容器名作为hostname
  • link容器时指定alias: --link=<Container-Name>:<Alias>
  • 配合--icc=false隔离性,实现容器间的安全连接
  • 环境变量注入

自定义网络中使用docker net提供如下功能:

  • 使用DNS实现自动化的名称解析
  • 一个网络提供容器的安全隔离环境
  • 动态地attach与detach到多个网络
  • 支持与--link选项一起使用,为链接的容器提供别名(可以是尚不存在链接容器,与默认容器中–link使用的最大差别)

默认网络中的link是静态的,不允许链接容器重启,而自定义网络下的link是动态的,支持链接容器重启(以及IP变化) 因此,使用--link时链接的容器,在默认网络中必须提前创建好,而自定义网络下不必预先建好。

使用docker network connetct将容器连接到新网络中时,用参数--link链接相同的容器时,可以指定不同的别名,它们是针对不同网络的。

docker-compose 管理集群

build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment