# Docker操作小结及GDG Docker第一次活动记录

> 作者：zning（https://ning.ae） · 发布：2019/08/12 21:52 下午 (UTC+8) · 原文：https://zning.me/15656179630389.html

最近有些地方需要Docker的使用，为了总结近期经验并且重拾Docker相关技术以及GDG Docker第一次活动记录，对一些操作进行重新总结。

## Docker常用操作

> 所有命令均省略`sudo`

查看所有镜像：

```shell
docker images
```

查看所有容器：

```shell
docker ps -a 
```

查看守护容器日志：

```shell
docker logs 容器名或容器id
```

杀死所有正在运行的容器：

```shell
docker kill $(docker ps -a -q)
```

删除所有已经停止的容器：

```shell
docker rm $(docker ps -a -q)
```
删除所有未打 dangling 标签的镜像：

```shell
docker rmi $(docker images -q -f dangling=true)
```
删除所有镜像：

```shell
docker rmi $(docker images -q)
```
查找你需要的Docker镜像列表：

```shell
docker search mysql
```
下载镜像：

```shell
docker pull [REGISTRYHOST/][USERNAME/]NAME[:TAG]
```
容器转成镜像：

```shell
sudo docker commit <CONTAINER ID> imagename01
```
容器转成文件：

```shell
sudo docker export <CONTAINER ID> > /home/export.tar
```
镜像转成文件：

```shell
sudo docker save imagename01 > /home/save.tar
```
注：一般情况下，save.tar比export.tar大一点点而已，export比较小，因为它丢失了历史和数据元metadata。

文件转成镜像：

```shell
cat /home/export.tar | sudo docker import - imagename02:latest
save.tar文件转成镜像：
```

```shell
docker load < /home/save.tar
```
查看转成的镜像：

```shell
sudo docker images
```
## GDG Docker第一次活动记录
### 查看Docker 版本

当Docker 安装完成后，可以用下面的命令来查看

```shell
docker -–version #版本信息
docker info #配置信息
docker -–help #帮助信息
```
![640](media/15656179630389/640.gif)

### 运行你的第一个docker 镜像

```shell
docker run hello-world
```
![640 -1-](media/15656179630389/640%20-1-.gif)
 

### Docker 命令行工具介绍

Docker CLI 指令分为两类，一类是 Management Commands，一类是镜像与容器Commands。

你可以通过docker –help 进行查看。

Docker 的命令格式为：

```shell
docker [OPTIONS] COMMAND
```

这里我们选取常用的几个命令进行示例:

`docker pull` :  从镜像仓库中拉取镜像

```
docker pull Ubuntu
```

![](media/15656179630389/15656188584972.jpg)

docker run :

```shell
docker run –it ubuntu:latest
```
- -i : interactive mode 
- -t: 分配tty 

![640 -2-](media/15656179630389/640%20-2-.gif)

Docker-CLI 与Linux 语法具有相似性，例如：

```shell
docker image ls 
docker container ls
docker container ps
```

![](media/15656179630389/15656189526661.jpg)

如果你有Linux 基础，那么相信对于Docker-CLI 上手还是比较容易的。

有了上面的基础，那么让我们来进入一个实战吧。

 

#### 实战-1：2048 Web

```
docker run -d -P daocloud.io/daocloud/dao-2048
```

Tip: -d 表示容器启动后在后台运行

用`docker ps` 查看容器运行状态如图：

看到端口映射关系 `0.0.0.0:32768->80`。指宿主机的 `32768` 端口映射到容器的 `80` 端口，用浏览器打开`localhost:32768`

![](media/15656179630389/15656190038086.jpg)

### Dockerfile 简介

Docker 可以从Dockerfile 文件中构建镜像，Dockerfile 语法请参考：

https://docs.docker.com/engine/reference/builder/

只需要几个基本的语法就能构建出我们需要的容器。

`FROM` : 这会从 Docker Hub 中拉取镜像，目的镜像基于所拉取的镜像进行搭建

`WORKDIR`: `RUN`, `CMD`, `ENTRYPOINT`, `COPY`, `ADD`以此为工作路径

`COPY`：拷贝文件或文件夹到指定路径

`RUN`：镜像的最上层执行命令，执行后的结果会被提交，作为后续操作基于的镜像。

`EXPOSE`：暴露端口号

`ENV`：设置环境变量

`CMD["executable","param1","param2"]`：一个Dockerfile 应该只有一处 CMD 命令，如果有多处，则最后一处有效。

 

#### 实战 -2：搭建Python Web

首先准备一个Dockerfile 文件与一个app.py 文件

![](media/15656179630389/15656190963688.jpg)

分别执行：

```
docker build --tag=friendlyhello . #build
docker run -p 4000:80 friendlyhello #run
curl http://localhost:4000 #test
docker container stop XXX #stop
```
 

中间输出结果：

![](media/15656179630389/15656191222195.jpg)

![](media/15656179630389/15656191332547.jpg)

![](media/15656179630389/15656191475196.jpg)

Docker 生成container时会生成一个唯一的container-id，在上图中stop 命令用到了container-id。当然，你可以使用docker tag 命令对container 进行重命名。

Tip: 

`-p 4000:80` : 指的是从宿主机端口4000 映射到容器端口80 

现在打开浏览器访问`localhost:4000`:

![](media/15656179630389/15656191615771.jpg)

## 参考文献

1. [GDG Docker第一次讲义幻灯片](https://devs.wiki/gdg/k8s/ch01/)
2. [【活动回顾】容器实战：Docker 基础入门 - GDG微信公众号](http://mp.weixin.qq.com/s?__biz=MjM5NDkwOTEyMQ==&mid=2651644330&idx=1&sn=1db9e08fa950e2ec0b87ce86422129dc&chksm=bd78df048a0f5612254d0acc5a4188a4fdbf66cf692d0ceb7d657de3974e7edce032b12599e1&mpshare=1&scene=1&srcid=&sharer_sharetime=1565403392033&sharer_shareid=7f3469b0e399ff2835e4d0d051c7de6a#rd)
