![](https://source.unsplash.com/random/1680x200) >### 镜像 * `docker image`是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如:centos+java7 * `docker image`是需要定制化build的一个安装包,包括基础镜像+应用的二进制部署包 * `docker image`内不建议有运行期需要修改的配置文件 * `Dockerfile`用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image * `docker image`的最佳实践之一是尽量重用和使用网上公开的基础镜像 >### 加速国内镜像下载 修改配置文件`/etc/docker/daemon.json`,如果该文件没有则进行创建: ``` [root@docker ~]# cat /etc/docker/daemon.json { "dns": ["192.168.101.2","8.8.8.8"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } ``` 然后重启docker `systemctl restart docker` >### 镜像命令 * 搜索镜像:`docker search nginx` > `nginx`为镜像名称(镜像名称如:centos、nginx、redis) * 拉取镜像:`docker pull nginx` * 列出本地镜像:`docker images(docker images --help)` > `docker image ls -a `同样是列出镜像(`docker image ls --help`查看) >### 容器 #### 概念 1、运行一个container的本身就是开启一个具有独立namespace的进程 2、进程有自己的网络,文件系统等 3、docker通过run命令来启动一个container运行一个container必须要指定一个image作为初始化的文件系统 4、对于不存在的image,docker会自动去registry里面下载对应的image,然后再运行container 5、在容器中是/bin/bash进程,也就是本机host上面的一个普通进程 6、如果image里面包含了CMD的命令,那么在启动container的时候,不需要指定command,否则会使用指定的command来覆盖image中的CMD 5、在容器中是/bin/bash进程,也就是本机host上面的一个普通进程 >### 前台运行和后台运行 默认的container是在前台运行的,会绑定command进程的STDIN、STDOUT、STDERR到console上(在console上展现标准输入、输出和标准错误输出) 可以通过`-d`的选项让container运行在后台。如果是在前台运行,也可以通过-a {STDIN,STDOUT,STDERR}选择需要绑定的IO 只选择某一个标准展示在console上面 ``` $ docker run -t -a stdin ubuntu sh -c "while true;do echo hello world;sleep 2;done" 910777ab7d217b803fb6e5cb9ed9e80a2296814ac7449dceda7f72fbaf7a1fd5 ``` `-a stdin`:表示只执行了`stdin`(虽然在前台运行,但是没有指定stdout和stderr所以并没有显示输出)可以通过logs来查看该容器的`stdout` 重新打开一个终端,查看当前容器ID,并且发硬容器日志 ``` $ docker ps CONTAINER ID IMAGE 910777ab7d21 ubuntu "sh -c 'while true;d…" 4 minutes ago Up 4 minutes $ docker logs 910777ab7d21 hello world hello world ``` 通过`attach`命令可以重新`attach`一个后台运行的container,`attach`可以将后台运行的切换到前台 ``` $ docker attach 910777ab7d21 hello world hello world ``` 在后台运行的情况下,`RUN`命令会返回一个容器的`uuid`,唯一标识container 可以通过`docker ps`来查看container的uuid和运行信息 可以通过指定`--name`的方式来指定container的名字,`name`必须唯一 #### `inspect`:可以查看container的更多信息 通过`docker inspect {container_id}`来获取container的更多的信息,包括网络,volume,实际在host上的进程id等信息 #### `log`:日志 通过logs命令可以看到container中command所指向进程的STDOUT,STDERR数据 ,可以进程排错(`-d`后台运行没有输出到console时,查看) #### 环境变量 通过`-e`参数,可以在运行container的时候添加系统环境变量 >### 网络设置 docker使用bridge桥接的方式来实现container之间以及和外部的通信 ![](https://i.loli.net/2019/03/02/5c7a4d878060d.png) >### 命令 * 查看运行中的容器:`docker ps` * 查看所有容器:`docker ps -a` * 启动一个容器 ``` # docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container # docker run 启动一个容器并执行命令(容器是本机host的一个进程,如果进程没有后续操作,那么状态将是exited) ``` > 创建一个名称为mycentos的container,并执行/bin/bash `docker run --name mycentos centos /bin/bash` >> `--name`:表示容器的name,后面的centos表示使用的哪个镜像(镜像name) >> `/bin/bash`:表示执行的command * 启动容器:`docker start mycentos` https://www.cnblogs.com/jsonhc/p/7760144.html