docker search 镜像名 [OPTION]
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
-q, --quiet Suppress verbose output
-a 下载这个镜像的所有版本
-q 静默下载。试了下,没下下来一直卡在那不动。。(后续再看看)
NAME 是包含了完整的名称的,类比Maven 就是 GA 两个属性,格式为
仓库地址/镜像名 ,而这个仓库地址又是 ip/域名:端口的形式;如不显式指定仓库地址,默认下载官方(docker.io/library/镜像名)的镜像。
:TAG 指定镜像的版本
@DIGEST 摘要下载,下载完毕后
例:docker pull docker.io/library/mysql:5.7
删除一个镜像 docker rmi (镜像名:标签)/镜像id
删除全部镜像 docker rmi $(docker images -aq)
$():类似sql子查询的操作,将子查询的结果传递到外层操作的参数列表,很多场景都可以使用
注意:这里的run是基于镜像创建新的容器,多次运行则会创建不同的容器。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
// 这里只介绍基础用法,具体参考,具体镜像还有自己支持的命令,这个依镜像而定
docker run --help
docker run IMAGE的id或者Docker 镜像的名称
-d 后台运行
--name 指定容器名称
-v 指定数据挂载目录 宿主机目录:容器目录
-p 端口映射 宿主机端口:容器端口
-P 容器端口随机映射到宿主机端口
-e 设置环境变量 key=value
ps: 常见的一种命令
基于镜像以交互式终端的形式启动并进入一个新的容器
docker run -it 镜像id bash
对于已经创建的容器,常用操作,基本使用容器id的地方均可用容器名称替换
// 启动
docker start 容器id
// 停止
docker stop 容器id
// 重启
docker restart
// 强制停止
docker kill
// 进入容器内部(【只有已经启动的容器才能执行】)
docker exec 容器id
与 docker run 类似,docker exec -it 容器id bash
docker ps [OPTION] 查看容器列表
-a 所有容器
-q 仅展示容器id
通过run 命令进入容器后,直接exit退出容器,此时容器会停止,若想退出时容器继续运行使用: ctrl + p + q 退出容器
删除容器
删除一个容器 docker rm 容器id
批量删除 docker rm $(docker ps -a)
强制删除 docker rm -f (容器id....)
docker logs 查看容器相关日志
-f 滚动日志
-n / --tail 200 显示多少行日志
其他参数 参考 --help
删除指定镜像创建的容器
删除带有mysql 关键字的容器 docker rm $(docker ps -a | grep mysql | awk '{print $1}')
查看容器内部进程信息 docker top 容器id
查看镜像/容器/网络等等元数据 docker inspect 对应的id或者名称
docker build -t 镜像名称[:标签] 上下文目录(一般直接指定为Dockerfile所在目录就行了)
Dockerfile 格式及脚本常用命令
FROM node:current-slim
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
EXPOSE 8080
自定一个简单tomcat环境
FROM centos
MAINTAINER asin2tk<111@qq.com>
ENV mypath /user/local
WORKDIR $mypath
COPY readme.txt .
ADD apache-tomcat-8.5.69.tar.gz .
ADD jdk-8u291-linux-x64.tar.gz .
RUN yum -y install vim
ENV JAVA_HOME /user/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /user/local/apache-tomcat-8.5.69
ENV CATALINA_BASE /user/local/apache-tomcat-8.5.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD startup.sh
FROM node:current-slim:类似Java中继承的意思,定制镜像的基础镜像,这是必须的,放在第一句。
WORKDIR /usr/src/app:设置工作目录,由于Docker镜像有分层的概念,构建镜像时,每一个Dockerfile 命令都是处于不同的层,这个命令的作用是在构建镜像时,会自动切换到指定目录,不存在时自动创建,这个命令作用于后续的所有层;另外当我们进入容器时默认的目录也是这个目录。
COPY package.json . : 就字面意思,将上下文目录里面的package.json复制到当前目录,看起来好像是从宿主机复制到容器内部,实际上,构建镜像的整个过程都是在Docker引擎内部完成的,构建之初,Docker会将整个上下文目录打包上传给Docker引擎,由Docker引擎去完成整个构建工作。
RUN npm install:RUN 后面可以接 shell 命令或者可执行文件。
EXPOSE 8080:声明对外暴露的端口,仅仅是声明而已。不影响镜像构建和容器运行。如果采用 docker run -P imageId 的方式运行容器,内部端口会使用这个端口。
这里着重说明几个常用易混淆的命令
若有文件目录操作,可以先行切换工作目录,而后在当前目录操作即可;如下
ENV mypath /user/local
# 切换工作目录到 /user/local
WORKDIR $mypath
# 此时复制到 . (当前目录)就变成了 /user/local
COPYdemo.txt .
docker run -d -p 5000:5000 --name registry registry
想要使用私有仓库,就可以直接指定仓库地址即可,"insecure-registries": [
"192.168.130.135:5000"
]
重启docker服务systemctl restart docker
容器互联
所谓容器互联就是不同的容器之间建立的联系;
Docker创建容器默认在docker0网络下;容器间可以通过ip互相访问,类似微服务的概念一旦进行扩缩容或者ip发生变化,它们之间的通过ip建立的关系将变得不可用,此时需要以一个不变的量建立关系。
实现容器A连接到容器B
1. docker run --name A --link B ....-d ...-p...
此种方式的本质是在A的 /etc/hosts 中维护一个 类似 (B的ip B)这样的配置,达到以B的名称连接的目的 。
2. 自定义网络的
由于docker0的桥接网络,不支持容器间以名称互相访问,但是自定义的网络是支持的,所以可以自定义一个网络实现
docker network create -d bridge --subnet xxx.xxx.xxx.xxx/8 --gateway xxx.xxx.xxx.xxx mynet
然后我们在启动容器时,指定连接到我们的自定义的网络即可
docker run -d --network mynet .........
如此,只要是运行在这个网络中的容器,都可以直接通过名称互相访问
然不同网络中的容器如何互联
docker network connect [OPTIONS] NETWORK CONTAINER
上述命令即将 容器接入到指定的网络中,这样位于该容器就可以和该网络中的其他容器进行通信。
不同容器之间无法直接通信,需经过被连接的容器所在网络桥接方式,即是将主动连接的容器接入被连接的容器所在的网络中就可以了