# 常用操作笔记

**场景1: 当下载了一个镜像,想查看image镜像里面一些信息.**

1.拉取一个镜像

```
$ docker pull php:alpine3.7
```

2.想知道镜像里面的php版本

```
 $ docker run  -it --rm php:alpine3.7 php -v
```

3.想对这个镜像里信息了解的更多,也就是得执行多条语句

```
$ docker run  -it --rm php:alpine3.7 sh -c "php -v && php -m"
```

4.如果想临时进去操作一下,查看更多的信息,加上sh,即可, 在容器中exit退出的时候,容器也随之消失

```
$ docker run -it --rm php:alpine3.7 sh
```

> 你进行docker ps 查看正在运行的容器的时候,发现**并没有运行**的容器.原因是因为 `--rm`, --rm， 指定容器停止后自动删除容器(不支持以docker run -d启动的容器),所以可以使用此方式来查看自己拉取容器里的一些信息.
>
> 备注:
>
> -i:以交互模式运行容器，通常与 -t 同时使用；
>
> -t:为容器重新分配一个伪输入终端，通常与 -i 同时使用；

**场景2: 当你使用了一个已经存在的开发框架的docker环境,那么你需要的是使用本地开发代码,一遍开发一遍使用docker里的环境测试**

以swoft为例,后台运行

```
$　docker run -d -p 80:80 --name swoft swoft/swoft:latest
```

其实就是在启动的时候把自己的开发本地目录映射到容器内的web目录即可.-v参数

```
$ docker run -p 80:80 --name swoft -d \
  -v /home/revin/swoft/:/var/www/swoft \
 swoft/swoft:latest
```

**场景3. 已经有了dockerfile文件,拿swoole开发为例**

1.构建Dockerfile

```
FROM php:alpine3.7
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories  && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN apk add m4 autoconf make gcc g++
RUN apk add linux-headers
ADD ./install/swoole-2.2.0.tgz /tmp/
RUN cd /tmp/swoole-2.2.0 && phpize && ./configure && make && make install
RUN docker-php-ext-enable swoole
CMD ["php","-m"]
```

> ADD 和COPY的不同之处在于Add 可以在里面帮你自动解压缩.

2.`docker build`指令构建Docker镜像

-t 构建后iamge的名字

```
$ docker build -t swoole-2.2 .
```

构建完成后就可以通过`docker images`指令查看镜像是否创建成功。

并映射了本地开发环境.

```
$ docker run -it --name testpro --rm \
-v /temp/test/swoole:/myapps \
-p 9501:9501 \
swoole-2.2 sh
```

上面的代码是运行一个容器,并进入容器,但是退出后容器会消失.

```
$ docker run --name testpro \
-v /temp/test/swoole:/myapps \
-p 9501:9501 \
-d swoole-2.2
```

上面的代码是后台运行一个容器,可以通过`docker exec -it swoft bash`进入容器进行交互.(alpine中无bash,可以使用sh)

3.当修改了代码,或者配置文件则需要重启容器

```
$ docker restart testpro
```

4.查看容器里的日志

```
$ docker logs testpro
```

5.当开发时,需要了解容器的ip地址等信息

```
$ docker inspect swoft
```

6.停止容器

```
$ docker stop testpro
```

其他的命令则`--help`进行查看

**场景4. 构建自己的image镜像。**

当你使用 别人的基础镜像，你可以镜像进行一些修改安装。

1、使用镜像启动一个容器

2、构建一个新的images

```
docker commit 容器名 image镜像名:tag
```

场景5：容器宿主机间相互拷贝文件

docker cp命令

文档:<https://docs.docker.com/engine/reference/commandline/cp/>

从容器中拷贝到主机:

```
docker cp tmp:/etc/nginx/nginx.conf /home/revin/nginx/conf/
```

也可以从宿主机拷贝到容器中

```
docker cp /home/revin/nginx/conf/ tmp:/etc/nginx/nginx.conf
```

不过一般情况下配置文件，只会挂载到容器中。

#### windows10 下

```
docker volume create portainer_data
docker run -d -p 8000:8000 -p 10001:9000 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer


docker volume create rabbitmq_data
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq3.8 -v rabbitmq_data:/var/lib/rabbitmq rabbitmq:3-management

docker volume create mongodb_data
docker run -d -p 27017:27017 --name mongodb -v mongodb_data:/data/db mongo


docker volume create redis_data
docker run -d -p 27017:27017 --name mongodb -v mongodb_data:c:\data\db mongo

# docker network create esnet (linux)
docker network create  --driver nat esnet
docker volume create elasticsearch_data
 docker run -d --name elasticsearch --net esnet -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "http.cors.enabled=true" -e "http.cors.allow-origin=*" -v elasticsearch_data:/usr/share/elasticsearch/data elasticsearch:7.8.1
#header
docker run -d -p 9100:9100 --name elasticsearch-manager mobz/elasticsearch-head:5-alpine
```
