0%

Docker基本使用

修改镜像源

(manjaro)只需要添加配置文件/etc/docker/daemon.json

1
2
3
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

或者使用–registry-mirror选项


一些Docker基础命令

容器操作

run: 通过运行镜像输出hello

docker run CONTAINER [COMMAND] [ARGS]

1
2
# 相当于先create再start
# e.g. docker run CONTAINER echo 'hello'

启动交互式容器

1
2
3
$ docker run -it CONTAINER /bin/bash
# e.g.:指定ip:host进行后台运行
$ docker run -it -d -p 127.0.0.1:12306:12306 --name postgres ichheitimg:9.1-deb /bin/bash

带名字的运行镜像

1
$ docker run --name='name' CONTAINER echo 'hello'

守护形式运行容器

1
2
$ docker run -it CONTAINER /bin/bash
# C^P C^Q退出,可docker ps查看守护容器

可直接启动后台

配置选项

1
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
# 运行相关选项
# -D, --debug=false
# -e, --exec-driver="native"
# -g, --graph="/var/lib/docker"
# --icc=true
# -l, --log-level="info"
# --label=[]
# -p, --pidfile="/var/run/docker.pid"
#
$ docker run -d CONTAINER [COMMAND] [ARG...]
# 服务器相关选项
# -G, --group="docker"
# -H, --host=[]
# --tls=false
# --tlscacert="/home/sven/.docker/ca.pem"
# --tlscert="/home/sven/.docker/ca.pem"
# --tlskey="/home/sven/.docker/ca.pem"
# --tlsverify=false
# Remote API存储相关
# -s, --storage-driver=""
# --selinux-enabled=false
# --storage-opt=[]
# Registry相关
# --insecure-registry=[]
# --registry-mirror=p[]
# 网络设置相关
# -b, --bridge=""
# --bip=""
# --fixed-cidr=""
# --fixed-cidr-v6=""
# --dns=[]
# --dns-search=[]
# --ip=0
# --ip-forward=true
# --ip-masq=true
# --iptables=true
# --ipv6=false
# --mtu=0

设置容器的端口映射

1
2
3
4
5
6
7
8
9
 # -p, --publish
# containerPort
$ docker run -p 80 -it CONTAINER /bin/bash
# hostPort:containerPort
$ docker run -p 8080:80 -it CONTAINER /bin/bash
# ip::containerPort
$ docker run -p 0.0.0.0:80 -it CONTAINER /bin/bash
# ip:hostPort:containerPort
$ docker run -p 0.0.0.0:8080:80 -it CONTAINER /bin/bash

create: 创建容器

1
2
# e.g.: 新建新容器,如果没有指定镜像,会自动pull镜像
$ docker create -it ubuntu:latest

start: 启动容器

1
2
# e.g.: 启动创建好的容器
$ docker start XXXXXXX

ps: 查看容器

docker ps [OPT]

1
2
# -a 全部记录
# -l 最新记录

rm: 删除容器

docker rm '{IMAGE}'

attach: 继续运行后台守护容器

docker attach '{IMAGE}'
dokcer attach [--detach-keys[=[]]] [--no-stdin][--sig-proxy[=true]] CONTAINER

1
2
3
4
5
6
7
8
```

### <font color="red">logs</font>: 查看容器日志
> `docker logs [OPT] '{IMAGE}'`
```zsh
# -f --follows=true|false 默认false
# -t --timestamps=true|false 默认false
# --tail="all"

exec: 在已运行的容器中启动新进程

docker exec [OPT] CONTAINER [COMMAND] {ARGS}

1
2
3
# -d
# -i
# -t

stop/kill: 停止容器

docker stop [-t | --time[=10]] CONTAINER
docker kill CONTAINER


镜像操作

images/inspect: 查看镜像

docker iamges [OPT] [REPOSITORY]
docker inspect [OPT] CONTAINER|IMAGE [...]

1
2
3
4
# -a, all=false
# -f, --filter=[]
# --no-trunc=false
# -q, --quiet=false

search: 查找镜像

docker search [OPT] TERM

1
2
3
4
# --automated=false
# --no-trunc=false
# -s, --stars=0
# --filter=stars=3

pull: 拉取镜像

docker pull [OPT] NAME [:TAG]

1
# -a, --all-ags=false

构建镜像

commit: 通过容器

docker commit [OPT] CONTAINER [REPOSITORY[:TAG]]

1
2
3
4
5
 # -a,--author=""
# -m,--message=""
# -p,--pause=true, 提交时暂停容器运行
# e.g.:提交本地deb容器
$ docker commit deb ichheitimg:9.1-deb

import: 通过本地模板导入

docker import [OPT] file |URL|[REPOSITORY[:TAG]]

1
2
# e.g.:导入
$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

build: 通过Dockerfile文件

docker build

通过Dockerfile

1
2
3
4
5
6
7
8
 # --force-rm=false
# --no-cache=false
# --pull=false
# -q, --quiet=false
# --rm=true
# -t, --tag=""
$ docker build [OPT] PATH | URL | -
# e.g. 在创建的目录中编写Dockerfile文件,然后使用$ docker build -t='name' .
Dockerfile格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# First Dockerfile
FROM [CONTAINER]
MAINTAINER [MESSAGE]
[COMMAND...]
EXPOSE 80
CMD ["executable", "param1", "param2"] (exec mode)
CMD command param1 param2 (shell mode)
CMD ["param1", "param2"] (ENTRYPOINT指令搭配下的参数)
ENTRYPOINT ["executable", "param1", "param2"] (exec mode)
ENTRYPOINT command param1 param2 (shell mode)
# CMD与ENTRYPOINT的区别是后者命令不会被构建时命令所覆盖,也可以使用--entrypoint覆盖
ADD <src> .. <dest>
COPY <src> ... <dest>
VOLUMN ["/data"]
(共享数据等作用,使用时在build构建前应使用--volumes-from选项挂在数据卷容器)
WORKDIR /path/to/workdir (指定工作目录)
ENV <key> <value>
ENV <key>=<value> ...
USER user (e.g. | USER user | USER user:group | USER user:gid |)
ONBUILD [INSTRUCTION] (添加触发器)
Dockerfile构建过程
  • 从基础镜像运行容器
  • 执行指令,对容器做修改
  • 执行类docker commit操作,提交新镜像层
  • 基于新镜像运行新容器
  • 执行Dockerfile的下一指令直到所有指令执行完毕

save: 存入镜像

docker save

1
2
# e.g.: 导出本地的ubuntu:14.04为文件ubuntu_14.014.tar
$ docker save -o ubuntu_14.04.tar ubuntu:14:04

load: 载入镜像

docker load

1
2
3
4
# e.g.: 导出tar文件到本地镜像库
$ docker load --input ubuntu_14.04.tar
# 或
$ docker load < ubuntu_14.04.tar

push: 上传镜像

docker push NAME[: TAG] |REGISTRY_HOST[: REGISTRY_PORT]/NAME[: TAG]

1
2
3
# e.g.: 用户user上传test:latest镜像到user/test:latest
$ docker tag test:latest user/test:latest
$ docker push user/test:latest

rmi: 删除镜像

docker rmi [OPT] IMAGE [...]

1
2
# -f, --force=false
# --no-prune=false

Docker的C/S模式:Remote API

连接方式

  • unix:///var/run/docker.dock
  • tcp://host:port
  • fd://socketfd

Docker的远程访问

1
2
3
4
# 默认配置-H unix:///var/run/docker.sock
# e.g.: docker -H tcp://ip:port COMMAND
# 可选择的环境变量DOCKER_HOST
# e.g.: export DOCKER_HOST="tcp://ip:port"

Docker容器互联

1
2
3
4
5
6
7
8
 # --icc=true,允许容器间互联
# 每次镜像重启都可能导致IP的变更,因此使用以下方式
# --link
$ docker run --link=[CONTAINER]:[ALIAS] [IMAGE][COMMAND]
# e.g. docker run -it --name test --link=other:alias img:test
# 只允许特定容器间连接
$ --icc=false --iptables=true
$ --link

Docker容器的数据卷

为容器添加数据卷

1
2
3
 # -v local_catalogue:docker_catalogue:[ro]
# e.g.
$ sudo dcoker run -v ~/container_data:/data -it ubuntu /bin/bash

在Dockerfile中使用COLUMN下指定数据卷容器

1
2
3
4
5
6
# e.g.:
# 编写Dockefile,指定VOLUME目录
$ docker build -t dorman/dvt .
$ docker run -it --name test dorman/dvt
# 以下--volumes-from将共享Dockfile中的目录
$ docker run -it --name test1 --volumes-from test ubuntu /bin/bash

Docker数据卷的备份和还原

1
2
$ docker run --volumes-from [container name] -v local_catalogue:docker_catalogue ubuntu
$ tar cvf /backup/backup.tar [container data volume]

Docker容器的跨主机连接

网桥实现

  • 通过在主机和虚拟机之间使用同一个网段来跨主机连接
  • 需要网络配置并且配置Docker网桥,并通过–fixed-cidr指定网络范围
  • (/etc/network/interfaces)

Open vSwitch实现

环境准备
  • 双网卡,Host-Only & NAT
  • 安装Open vSwitch和网桥管理工具bridge-utils
  • 同一网段的IP地址
操作
  • 建立ovs网桥
  • 添加gre连接
  • 配置docker容器虚拟网桥
  • 为虚拟网桥添加ovs接口
  • 添加不同DOcker容器网段路由

weave实现