Eli's Blog

1. 基本命令

1
2
3
4
5
6
7
8
docker info

docker version

docker system df # 存储统计

docker login https://hub.elihe.io
docker logout

2. 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker images
docker image ls

docker search nginx
docker pull nginx

docker tag nginx hub.elihe.io/mylib/nginx:v0.1
docker push hub.elihe.io/mylib/nginx:v0.1

docker run --name myweb -p 80:80 -d nginx
docker commit -p myweb hub.elihe.io/mylib/nginx:v0.2

docker history hub.elihe.io/mylib/nginx:v0.2

docker save -o myweb0.2.tar hub.elihe.io/mylib/nginx:v0.2
docker load -i myweb0.2.tar

docker export myweb | gzip > myweb.tar.gz
docker import myweb.tar.gz hub.elihe.io/mylib/nginx:v0.3 # to image

docker rmi -f hub.elihe.io/mylib/nginx:v0.3

docker image prune # 清理 dangling 镜像
docker image prune -a # 清理所有没有关联容器的镜像

2.1 特殊镜像

2.1.1 虚悬镜像(dangling image)

仓库名、标签均为 的镜像 (docker pull/build 时,原有的镜像名被占用,会导致此种情况)

1
2
3
4
5
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago

$ docker image prune # 删除虚悬镜像

2.1.2 中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像

1
$ docker image ls -a

3. 容器

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
docker create --name myweb -p 80:80 --cpu-shares=1024 nginx # cpu 占用100%
docker start myweb
docker stop myweb
docker pause myweb
docker unpause myweb

docker ps
docker kill myweb
docker rm myweb

# Ctrl+P Ctrl+Q 切换到后台运行, 变成守护式容器
docker run --name test -it alpine /bin/sh
docker attach test # Attach local standard input, output, and error streams to a running container, exit后,容器自动停止

# 守护式容器, 适合有常驻进程的镜像
docker run --name myweb2 -p 8080:80 -d nginx
docker exec -it myweb2 /bin/sh

docker logs -tf --tail=10 myweb2 # 查看容器日志. -f --follows, -t --timestamps
docker inspect myweb2

docker port myweb2
docker top myweb2 # 容器进程
docker stats myweb2 # 实时监控,相当于进入容器执行 top

# 宿主机与容器的文件拷贝
docker cp myweb2:/usr/share/nginx/html/50x.html .
docker cp index.html myweb2:/usr/share/nginx/html/

3.1 什么是守护式容器?

  • 能够长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务

3.2 CPU 限制

  • -c, --cpu-shares: 1024 means 100% of the CPU
  • --cpuset-cpus: 使用那些 CPU
1
2
docker run --cpu-shares=512   # 50% CPU
docker run --cpuset-cpus=0,2,4 # 使用0,2,4三个 CPU

3.3 内存限制

  • -m, --memory: 限制内存使用
1
docker run -it -m 300M ubuntu /bin/sh

3.4 访问宿主机设备限制

1
2
3
4
5
6
7
8
# Mount a FUSE based fs
docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs

# give access to a single device
docker run -it --device=/dev/ttyUSB0 ubuntu /bin/sh

# give access to all devices
docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu /bin/sh

4. 网络

1
2
3
4
5
6
7
8
9
10
11
12
13
docker network create
docker network rm

docker network connect
docker network disconnect

docker network ls
NETWORK ID NAME DRIVER SCOPE
5edf46553116 bridge bridge local
3f0e974cff7d host host local
016c2058322a none null local

docker network inspect bridge

5. Volumes

1
2
3
4
5
docker volume create
docker volume rm

docker volume ls
docker volume inspect

6. 常用命令总结

docker-commands-diagram

7. 简单示例

7.1 MySQL

1
2
3
4
5
docker pull mysql:5.7

docker run --name mysqlsrv -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7

docker exec -it mysqlsrv /bin/bash

7.2 容器中部署静态网站

Nginx部署流程

  • 创建映射80端口的交互式容器
  • 安装Nginx
  • 安装文本编辑器vim
  • 创建静态页面
  • 修改Nginx配置文件
  • 运行Ngix
  • 验证网站访问
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
docker run --name web -p 8080:80 -it ubuntu /bin/bash

root@ecd4887cf28d:/#

apt-get update
apt-get install -y nginx vim

mkdir -p /var/www/html
echo '<h1>Nginx in Docker</h1>' > /var/www/html/index.html

vi /etc/nginx/sites-enabled/default
server {
root /var/www/html;
}

nginx
ps -ef

CTRL-P, CTRL-Q # 退出容器,容器转后台运行

docker port web # 查看端口

curl http://127.0.0.1:8080 # 访问网页

docker stop web # 停止容器
docker start -i web # 运行容器
docker exec web nginx # 启动nginx