0%

docker

文章字数:1482,阅读全文大约需要5分钟

基本概念

  1. 镜像Image: 相当于一个root文件系统。
  2. 容器Container: 是镜像在运行中的实例,和镜像的关系类似于类和实例。
  3. 仓库Repository: 用于保存镜像Docker Hub 提供了大量镜像集合供使用。
  4. 注册中心Registry: 包含多个仓库,每个仓库有多个标签Tag。通常用<仓库名>:<标签>指定镜像,标签为镜像版本号,不写默认为latest
  5. 客户端client: 用户可以通过客户端,利用命令行或其他工具和docker的守护进程通讯
  6. 主机host: 物理或虚拟机器,用于执行Docker守护进程和容器

基础环境

  1. 前期准备
  • 卸载旧版本(docker、docker.io、docker-engine)

    1
    sudo apt-get remove docker docker-engine docker.io containerd runc
  • 当前为Docker Engine-Community 软件包 docker-ce

  • 更新仓库索引

    1
    sudo apt-get update
  • 安装https依赖包

    1
    2
    3
    4
    5
    6
    sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
  1. 自动安装
1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

或者

1
curl -sSL https://get.daocloud.io/docker | sh

基本使用

  1. hello world
1
docker run ubuntu:15.10 /bin/echo "hello world"
  • run命令代表运行容器
  • ubuntu:15.10指定ubuntu镜像15.10标签的镜像实例。如果不存在此镜像,Docker会从镜像仓库Docker Hub中下载公共镜像
  • /bin/echo "hello world"在容器启动后执行的命令
  1. 交互
1
docker run -i -t ubuntu:15.10 /bin/bash
  • -i允许容器内的标准输入STDIN进行交互
  • -t在新容器内指定一个伪终端或终端
  • 使用exit命令或者CTRL+D可以退出容器
  1. 容器后台启动
1
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • -d后台执行
  • -c启动后执行命令
  1. 查看容器状态
1
2
3
docker ps
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
  1. 查看后台容器的日志
1
docker logs 5917eac21c36
  1. 停止容器
1
docker stop 5917eac21c36
  1. 容器别名
1
2
3
4
5
docker run --name=myName ...
# 之后就可以
docker logs myName
# 以及
docker stop myName
  1. 容器信息对照表
标题 含义
CONTAINER ID 容器 ID
IMAGE 使用的镜像
COMMAND 启动容器时运行的命令
CREATED 容器的创建时间
PORTS 容器的端口信息和使用的连接类型(tcp\udp)
NAMES 自动分配的容器名称
STATUS 容器状态
  1. 容器状态对照表
状态 含义
created 已创建
restarting 重启中
running/up 运行中
removing 迁移中
paused 暂停
exited 停止
dead 死亡

容器使用

  1. 查看所有的命令
1
docker command --help
  1. 获取镜像
1
docker pull ubuntu
  1. 启动容器
1
docker run -it ubuntu /bin/bash
  • -it-i -t,开启交互,打开终端
  • /bin/bash镜像名后面跟的是命令,当前命令是希望开启容器后打开交互式的shell
  1. 退出
  • 命令行模式
    1
    exit
  1. 后台启动
1
docker run -itd --name ubuntu-test ubuntu /bin/bash
  • -d即不进入容器
  • -it是打开输入,并开启终端
  1. 进入后台开启的容器
1
docker exec ubuntu-test
  • exec命令进入后exit不会停止容器
  • attach命令进入后exit会停止容器,不建议使用
  • docker exec --help查看更多参数
  1. 本地容器导出
1
docker export 1e560fca3906 > ubuntu.tar
  1. 导入镜像
1
cat docker/ubuntu.tar | docker import - test/ubuntu:v1

也可以导入路径或是网络地址

1
docker import http://example.com/exampleimage.tgz example/imagerepo
  1. 删除容器
1
docker rm -f xxxxxxx
  1. 清除所有终止状态的容器
1
docker container prune
  1. web应用端口映射
1
docker run -d -p imageName
  • -d后台运行
  • -p容器内部网络端口映射到外部主机
  • -p 80:8098可以指定容器内部的80端口映射到外部主机的8098端口上
  • -p 127.0.0.1:80:8098端口映射的同时绑定容器的ip
  • docker port xxxxx可以查看具体容器的端口映射情况
  1. 挂载宿主机的目录
1
docker run -v /home/dock:usr/docker ubuntu64
  • -v 宿主机目录:镜像目录
  • 默认读写权限,-v 宿主机目录:镜像目录:ro指定只读
  1. 挂载其他的容器,作为数据存储
1
docker run -it --volumes-from xxxxx ubuntu64 /bin/bash
  • --volumes-from挂载数据卷,一般是一个容器挂载宿主目录,然后其他容器再将这个容器当做数据卷挂载。

镜像的使用

  1. 列出本机镜像列表
1
docker images
  1. 查找镜像
1
docker search httpd
列名 含义
NAME 镜像仓库名称
DESCRIPTION 镜像描述
OFFICIAL 是否是官方发布
STARS 点赞数
AUTOMATED 是否是自动构建
  1. 拉取镜像
1
docker pull httpd
  1. 删除镜像
1
docker rmi httpd
  1. 修改并创建新镜像
  • 如果当前镜像不满足要求,可以直接对镜像的实例进行修改,然后保存快照形成镜像

  • 运行一个实例,并修改内容

    1
    2
    docker run -t -i ubuntu:15.10 /bin/bash
    root@e218edb10161:/# apt-get update
  • 保存为快照

    1
    docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
  • -m提交描述

  • -a镜像的作者

  • e218edb10161容器id,提交那个容器

  • runoob/ubuntu:v2创建的镜像名

  1. 构建镜像
1
docker build -t runoob/centos:6.7 ./dockerFile
  • -t指定创建的镜像名
  • ./dockerFiledockerFile地址

仓库管理

  1. 登录仓库,登录docker hub
1
docker login
  1. 退出
1
docker logout
  1. 搜索仓库
1
docker search ubuntu
  1. 拉取镜像
1
docker pull ubuntu
  1. 推送镜像
1
2
3
4
5
6
# 标记镜像
docker tag ubuntu:18.04 username/ubuntu:18.04
# 列出本机所有镜像
docker image ls
# 推送镜像到仓库
docker push username/ubuntu:18.04

docker容器互联

  1. 创建网络
    1
    docker nerwork create -d bridge test-net
  • -d指定网络类型,有bridgeoverlay
  1. 创建两个容器并设置网络
1
2
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
  1. 测试网络连接
1
2
ping test1
ping test2

配置DNS

  1. 全局DNS
  • 宿主机/etc/docker/daemon.json
1
2
3
4
5
6
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
  1. 查看容器DNS
1
docker run -it --rm  ubuntu  cat etc/resolv.conf
  1. 启动时手动指定DNS
    1
    docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu
  • -rm退出时自动清理内部文件系统
  • -h HOSTNAME 设置主机名,会被写到/etc/hostname/etc/hosts
  • --dns--search=test.com设置搜索域,当搜索名为host的主机时,还会多搜索一个host.test.com
  • -dns指定dns