docker入门

简介

Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

中文官网

DockerHub

安装

Ubuntu上的安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 卸载旧版本
$apt-get remove docker docker-engine docker.io
// 使用存储库进行安装
$ apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
// 添加Docker的官方GPG密钥
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
// 添加Docker软件源
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
$sudo apt-get install docker-ce
// 运行hello-world
$docker run hello-world
// 以非root用户身份运行docker
$sudo groupadd docker
$sudo usermod -aG docker $USER

使用

部署

使用中国的官方镜像加速

1
2
3
4
5
6
// 守护进程传参
$ docker --registry-mirror=https://registry.docker-cn.com daemon
// 通过配置项来修改 /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

docker远程仓库的使用

1
2
$docker tag local-image:tagname new-repo:tagname
$docker push new-repo:ragname

构建应用

创建Dockerfile, app.py, requirements.txt

1
$docker build -t friendlyhello .

运行应用

-d 后台运行

-p 内外端口映射

1
$docker run -d -p 4000:80 friendlyhello

停止服务

1
2
$docker ps
$docker stop ${CONTAINER ID}

服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# docker-compose.yml
version: "3"
services:
web:
# 将 username/repo:tag 替换为您的名称和镜像详细信息
image: username/repository:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory:50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:

运行新的应用

1
2
3
4
5
6
$docker swarm init
// 部署应用
$docker stack deploy -c docker-compose.yml getstartedlab
// 查看服务容器列表
$docker stack ps getstartedlab
// 修改docker-compose.yml参数再部署应用就是更新

清除应用

1
2
3
4
// 删除应用
$docker stack rm getstartedlab
// 清除swarm
$docker swarm leave --force

swarm集群

利用Virtualbox来创建

VirtualBox安装

1
$wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -

docker-machine安装

1
https://github.com/docker/machine/releases/
1
2
3
// 创建一对VM
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

myvm1发送命令

1
2
3
$docker-machine ssh myvm1 "docker swarm init"
// --advertise-addr错误的解决
$docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"

技术栈

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
version: "3"
services:
web:
# 将 username/repo:tag 替换为您的名称和镜像详细信息
image: huguanghui/helltest:latest
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:

技巧总结

查看本地Docker镜像库

1
$docker images

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像
docker run -p 4000:80 friendlyname # 运行端口 4000 到 90 的“友好名称”映射
docker run -d -p 4000:80 friendlyname # 内容相同,但在分离模式下
docker ps # 查看所有正在运行的容器的列表
docker stop <hash> # 平稳地停止指定的容器
docker ps -a # 查看所有容器的列表,甚至包含未运行的容器
docker kill <hash> # 强制关闭指定的容器
docker rm <hash> # 从此机器中删除指定的容器
docker rm $(docker ps -a -q) # 从此机器中删除所有容器
docker images -a # 显示此机器上的所有镜像
docker rmi <imagename> # 从此机器中删除指定的镜像
docker rmi $(docker images -q) # 从此机器中删除所有镜像
docker login # 使用您的 Docker 凭证登录此 CLI 会话
docker tag <image> username/repository:tag # 标记 <image> 以上传到镜像库
docker push username/repository:tag # 将已标记的镜像上传到镜像库
docker run username/repository:tag # 运行镜像库中的镜像
docker search <key> # 搜索docker镜像