# Docker

## Docker

* docker images:查看本地镜像
* docker search sourceName :搜索镜像
  * docker search --filter "is-official=true" sourceName:过滤官方镜像
  * docker search --filter "is-official=true" node:官方node镜像
  * docker search --filter stars=10 sourceName:星星大于10的指定镜像资源
* docker pull sourceName :下载指定资源镜像
  * docker pull sourceName:版本号
  * docker pull centos:7    :下载centos7镜像
* docker tag centos:7 mycentos:first  :修改镜像名称(小写)
* docker rmi sourceName :删除本地镜像
  * docker rmi centos:7 :删除centos7镜像&#x20;
* docker run -it sourceName|imageId:tag :启动容器(不加:tag 默认运行本地最新的:latest 没有就远程下载)
  * -i :以交互模式运行容器
  * -t :为容器重新分配一个终端
  * -d :后台运行
* docker ps :查看运行的容器
  * -a :显示所有(包括已经关闭的)
* docker stop ContainerId:停止后台运行的容器
* docker run -itd --name=testcentos centos:7 :指定运行容器的name,方便停止
  * docker stop testcentos: 用name停止
  * docker start testcentos: 启动
  * docker restart testcentos: 重启
  * dokcer rm testcentos :删除容器(必须停止的容器)
    * -f :强制删除
  * docker inspect testcentos: 查看容器的详细信息
* docker exec -it mycentos /bin/bash:进入后台运行的centos容器
* docker stop $(docker ps -q):停止所有的运行中的容器
  * docker ps -q:查询所有运行中容器的id
  * docker ps -aq:所有容器的id
* docker start ${docker ps -a -q}:运行所有容器
* docker cp /root/test.txt imageName:/home/ :拷贝本地文件/root/test.txt到容器中的/home/目录下
* docker cp imageName:/home/test.txt /root :拷贝容器中的文件到宿主机上
* docker run -itd -v 要挂载目录:容器中的目录 imageName:tag:挂载指定目录到指定容器中
* docker commit -a "author" -m "description" containerId myImageName:Tag :基于现有的镜像创建自己的镜像

  **配置阿里云加速器加速镜像下载(可以去阿里云控制台寻找专属的)**

  ```
  mkdir -p /etc/docker
  tee /etc/docker/daemon.json <<-'EOF'
  {
  "registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]
  }
  EOF
  systemctl daemon-reload
  systemctl restart docker
  ```

### Dockerfile

使用Dockerfile构建镜像

dockerfile

```
# this is a dockerfile
FROM centos:7 # 基于centos:7镜像构建
MAINTAINER sugar engineerzjl@foxmail.com #作者信息
RUN echo "start build image" # 运行命令
WORKDIR /home/sugar #工作目录
COPY test.txt /home/sugar # 复制文件
RUN yum install -y net-tools # 运行安装命令
```

开始构建末尾的一点代表当目录

```
docker build -t mycentos:2 .
```

#### 常用指令

```
FROM    #基于哪个镜像
MAINTAINER 作者信息
COPY    #复制文件(单纯的复制,不做其他操作)
ADD     #复制文件如果是 .tar.gz 还会解压
WORKDIR #工作目录
ENV     #设置环境变量
EXPOSE  #暴露容器端口
RUN     #执行命令  作用于镜像层面

# 有多条时 在容器启动时执行最后一条
ENTRYPOINT  #执行后面的命令 作用于容器层面
CMD     #指定后面的命令 作用于容器层面 (会被传参覆盖)
  docker run imageName:tag params
```

命令格式

* shell:RUn echo "hello world
* exec:RUN \["yum","install","-y","net-tools"]

### 镜像分层结构

查看镜像的构建历史

```
docker history imageName:tag
```

镜像只读,容器可读可写

### 构建java环境

```
解压
tar -xf jdkxxxx
移动 jdk /usr/local
mv jdk /usr/local/jdk
配置环境变量
vi /etc/profile
加入已下内容在末尾
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

生效环境变量
source /etc/profile
检验
java -version

拷贝tomcat到指定目录中然后在bin目录中找到startup.sh启动
需要关闭防火墙才能访问(也可放行端口)
```

dockerfile构建

```
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk8
ENV JAVA_HOME=/usr/local/jdk8
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
```

启动

```
docker run -itd -p 8081:8080 -v /root/tomcatWebapps:/usr/local/tomcat/webapps/ROOT centos:java /bin/bash
```

## 构建nginx镜像

dicjerfile

```
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80
```

shell

```bash
#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install
```

运行

```bash
docker run -itd -p 8081:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
```

经测试可以后台启动容器后 进入容器再打开nginx

```
docker exec -it containerId /bin/bash
cd /usr/local/nginx/sbin
./nginx
```

### mysql镜像

拉取

```bash
docker pull mysql:5.7
```

后台运行

```bash
docker run --name test-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=a123456 -d mysql:5.7
```

进入容器(并设置字符编码)

```bash
docker exec -it test-mysql env LANG=C.UTF-8 /bin/bash
```

### 网络

* bridge  桥接
* host    主机
* none   &#x20;


---

# 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://sugar-at.gitbook.io/blog-article/docker.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.
