docker

Posted by moloach on 2019-03-15

安装

1
2
3
4
5
sudo yum install docker
sudo apt install docker-ce


#可把普通用户添加到docker用户组来避免使用`sudo`权限

常用命令

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
39
40
41
42
43
44
45
# 创建并运行新的镜像(命令)
docker run centos echo "hello"

# 创建并运行新的镜像(交互式)
docker run -i -t centos /bin/bash

docker run -d --name [containerName] centos[imageName] /bin/sh -c "while true; do echo hello docker; sleep 1; done"

# 启动守护容器
docker run -d imageName [COMMAND] [Args ..]

#退出交互式命令不退出镜像
Ctrl+P Ctrl+Q

# 查看所创建的所有容器
docker ps -l -a

# 查看某一容器的详情信息
docker inspect [container-id]|[container-name]

# 删除某一容器
docker rm

# 开始某一存在的容器(回到退出的容器)
docker start [container-id]|[container-name]

# 附加到已存在的命令
docker attach [container-id]|[container-name]


# 查看容器日志(了解容器内部运行情况)
docker logs [-f][-t][--tail] 容器名
-f --follows = true|false 默认为false
-t --timestamps = true|false 默认为false
--tail = "all"

# 查看容器内进程
docker top

# 在运行中的容器内启动新进程
docker exec [-d][-i][-t] 容器名 [COMMAND][ARG..]

# 停止守护容器
docker stop containerName (发出停止信号)
docker kill containerName (发出直接退出)

容器端口映射

使用系统的端口映射到容器的端口,用来提供容器服务

1
2
3
4
5
6
7
8
9
10
11
docker run [-P][-p]
-P, --publish-all=true|false 默认为false , 所有端口
-p, --public=[]
containerPort docker run -p 80 -i -t ..
hostPort:containerPort docker run -p 8080:80 -i -t ..
ip::containerPort docker run -p 0.0.0.0:80 -i -t ..
ip:hostPort:containerPort docker run 0.0.0.0:8080:80 -i -t ..


# 查看端口映射
docker port container-id|container-name

管理镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 列出镜像
docker images [OPTIONS] [REPOSITORY]
-a, --all=false
-f, --filter=[]
--no-trunc=false
-q, --quit=false

# 查看镜像
docker inspect [OPTIONS] CONTAINER|IMAGE[CONTAINER|IMAGE...]

# 删除镜像
docker rmi [OPTIONS] IMAGE

获取和推送镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找镜像
docker search [OPTIONS] TERM
--automated=false
--no-trunc=false
--s --stars=0
最多返回25个结果

# 拉取镜像
docker pull [OPTIONS] NAME [:TAG]
-a, --all-tags=false

# 推送镜像
docker push [IMAGE:NAME]

构建镜像

1
2
3
4
通过容器
docker commit ][OPTIONS] CONTAINER [REPOSTORY:[TAG]]

docker build dockerfile

dockerfile

文档

1
2
RUN
EXPORT

构建缓存

构建中会缓存构建中间层对象

查看镜像构建过程

docker history

网络连接

docker0 网卡(linux 虚拟网桥)

  • 特点
    • 设置IP地址
    • 相当与拥有一个隐藏的虚拟网卡
  • 地址划分
    • IP:172.17.42.1 MASK:255.255.0.0
    • MAC 一个范围
    • 总共提供了65534个地址

结构图

1
2
3
4
5
6
7
8
9
10
=============================
= =
= docker0 =
= veth* veth* veth* = HOST
= || || || =
=============================
|| || ||
====== ====== ======
=eth0= =eth0= =eth0= CONTAINERS
====== ====== ======

自定义虚拟网桥
  • 添加虚拟网桥

    1
    2
    sudo brctl addbr br0
    sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
  • 更改docker守护进程中启动配置

    1
    2
    /etc/default/docker 中添加DOCKER_OPS值
    -b=br0

容器之间互联

允许所有容器互联

1
2
3
4
`--icc=true`
默认, 同一网桥之下都可以访问
`--link`
docker run --link=[container-name]:[ALIAS] [IMAGE] [COMMAND]

拒绝所有容器互联

1
--icc=false

允许特定容器互联

1
2
--icc=false --iptables=true
--link

容器与外部网络连接

1
--ip-forward=true

深入了解可以通过学习iptables

docker数据卷

数据卷是通过特殊设计的目录, 可以绕过联合文件系统(UFS),为一个或多个容器提供访问

为了数据的永久化,独立于容器的生存周期。

特点

  • 在容器启动时初始化,如果容器使用的镜像在挂在店包含了数据, 这些数据会拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间爱你共享和重用
  • 可以对数据卷中的内容直接进行修改
  • 数据卷的变化不会影响镜像的更新
  • 卷会一致存在,即时挂载数据卷的容器已经删除

为容器添加数据卷
docker run -v ~/container_data:/data -it centos /bin/bash

dockerfile文件
VOLUME ['path/to']

数据卷容器

命名的容器挂载数据卷, 其他容器通过挂载这个容器实现数据共享
docker run --volumes-from [CONTAINER NAME]