文章字数:1482,阅读全文大约需要5分钟
基本概念
- 镜像
Image
: 相当于一个root
文件系统。 - 容器
Container
: 是镜像在运行中的实例,和镜像的关系类似于类和实例。 - 仓库
Repository
: 用于保存镜像Docker Hub 提供了大量镜像集合供使用。 - 注册中心
Registry
: 包含多个仓库,每个仓库有多个标签Tag
。通常用<仓库名>:<标签>
指定镜像,标签为镜像版本号,不写默认为latest
- 客户端
client
: 用户可以通过客户端,利用命令行或其他工具和docker的守护进程通讯 - 主机
host
: 物理或虚拟机器,用于执行Docker
守护进程和容器
基础环境
- 前期准备
卸载旧版本(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
6sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
- 自动安装
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
或者
1 | curl -sSL https://get.daocloud.io/docker | sh |
基本使用
- 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 | docker run -i -t ubuntu:15.10 /bin/bash |
-i
允许容器内的标准输入STDIN
进行交互-t
在新容器内指定一个伪终端或终端- 使用
exit
命令或者CTRL+D
可以退出容器
- 容器后台启动
1 | docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" |
-d
后台执行-c
启动后执行命令
- 查看容器状态
1 | docker ps |
- 查看后台容器的日志
1 | docker logs 5917eac21c36 |
- 停止容器
1 | docker stop 5917eac21c36 |
- 容器别名
1 | docker run --name=myName ... |
- 容器信息对照表
标题 | 含义 |
---|---|
CONTAINER ID | 容器 ID |
IMAGE | 使用的镜像 |
COMMAND | 启动容器时运行的命令 |
CREATED | 容器的创建时间 |
PORTS | 容器的端口信息和使用的连接类型(tcp\udp) |
NAMES | 自动分配的容器名称 |
STATUS | 容器状态 |
- 容器状态对照表
状态 | 含义 |
---|---|
created | 已创建 |
restarting | 重启中 |
running/up | 运行中 |
removing | 迁移中 |
paused | 暂停 |
exited | 停止 |
dead | 死亡 |
容器使用
- 查看所有的命令
1 | docker command --help |
- 获取镜像
1 | docker pull ubuntu |
- 启动容器
1 | docker run -it ubuntu /bin/bash |
-it
即-i -t
,开启交互,打开终端/bin/bash
镜像名后面跟的是命令,当前命令是希望开启容器后打开交互式的shell
- 退出
- 命令行模式
1
exit
- 后台启动
1 | docker run -itd --name ubuntu-test ubuntu /bin/bash |
-d
即不进入容器-it
是打开输入,并开启终端
- 进入后台开启的容器
1 | docker exec ubuntu-test |
exec
命令进入后exit
不会停止容器attach
命令进入后exit
会停止容器,不建议使用docker exec --help
查看更多参数
- 本地容器导出
1 | docker export 1e560fca3906 > ubuntu.tar |
- 导入镜像
1 | cat docker/ubuntu.tar | docker import - test/ubuntu:v1 |
也可以导入路径或是网络地址
1 | docker import http://example.com/exampleimage.tgz example/imagerepo |
- 删除容器
1 | docker rm -f xxxxxxx |
- 清除所有终止状态的容器
1 | docker container prune |
- web应用端口映射
1 | docker run -d -p imageName |
-d
后台运行-p
容器内部网络端口映射到外部主机-p 80:8098
可以指定容器内部的80
端口映射到外部主机的8098
端口上-p 127.0.0.1:80:8098
端口映射的同时绑定容器的ipdocker port xxxxx
可以查看具体容器的端口映射情况
- 挂载宿主机的目录
1 | docker run -v /home/dock:usr/docker ubuntu64 |
-v 宿主机目录:镜像目录
- 默认读写权限,
-v 宿主机目录:镜像目录:ro
指定只读
- 挂载其他的容器,作为数据存储
1 | docker run -it --volumes-from xxxxx ubuntu64 /bin/bash |
--volumes-from
挂载数据卷,一般是一个容器挂载宿主目录,然后其他容器再将这个容器当做数据卷挂载。
镜像的使用
- 列出本机镜像列表
1 | docker images |
- 查找镜像
- 可以通过(Docker Hub)[https://hub.docker.com/]网站查找
- 或者通过命令查询
1 | docker search httpd |
列名 | 含义 |
---|---|
NAME | 镜像仓库名称 |
DESCRIPTION | 镜像描述 |
OFFICIAL | 是否是官方发布 |
STARS | 点赞数 |
AUTOMATED | 是否是自动构建 |
- 拉取镜像
1 | docker pull httpd |
- 删除镜像
1 | docker rmi httpd |
- 修改并创建新镜像
如果当前镜像不满足要求,可以直接对镜像的实例进行修改,然后保存快照形成镜像
运行一个实例,并修改内容
1
2docker 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 | docker build -t runoob/centos:6.7 ./dockerFile |
-t
指定创建的镜像名./dockerFile
dockerFile地址
仓库管理
- 登录仓库,登录docker hub
1 | docker login |
- 退出
1 | docker logout |
- 搜索仓库
1 | docker search ubuntu |
- 拉取镜像
1 | docker pull ubuntu |
- 推送镜像
1 | # 标记镜像 |
docker容器互联
- 创建网络
1
docker nerwork create -d bridge test-net
-d
指定网络类型,有bridge
和overlay
- 创建两个容器并设置网络
1 | $ docker run -itd --name test1 --network test-net ubuntu /bin/bash |
- 测试网络连接
1 | ping test1 |
配置DNS
- 全局DNS
- 宿主机
/etc/docker/daemon.json
1 | { |
- 查看容器DNS
1 | docker run -it --rm ubuntu cat etc/resolv.conf |
- 启动时手动指定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