# 常用操作笔记

**场景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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docker.shujuwajue.com/chang-yong-cao-zuo-bi-ji.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
