概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf /data/conf/nginx.conf
docker cp /data/conf/nginx.conf 5eff66eec7e1:/etc/nginx/nginx.conf
- 使用命令进行登录
- 登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像
docker login [options] [server]
options
-- password,-p 密码
-- password-stdin 从stdin获取密码
-- username,-u 用户名
server 不指定的话,默认是Docker Hub
- 退出
docker logout
在运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub公共镜像源下载。
使用docker image --help
查看关于镜像的相关命令
运行镜像,即启动容器
docker run -t -i ubuntu:20.04 /bin/bash
查找镜像
获取一个新的镜像
推送镜像
docker push ubuntu:18.04 username/ubuntu:18.04
删除镜像
docker rmi
命令,比如我们删除httpd镜像docker rmi httpd
自定义自己的镜像
docker run -t -i ubuntu:20.04 /bin/bash
apt update
命令进行更新。exit
命令来退出这个容器。e218edb10161
的容器docker commit
来提交容器副本。docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
docker run -t -i runoob/ubuntu:v2 /bin/bash
使用 Dockerfile 指令来创建一个新的镜像
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
docker build -t runoob/centos:6.7 .
设置镜像标签
使用docker tag设置镜像标签
docker tag 860c279d2fec runoob/centos:dev
首先获取镜像
若我们本地没有ubuntu镜像,我们可以使用docker pull命令来载入ubuntu镜像:
启动容器
要退出终端,直接输入 exit命令或者使用ctrl+D来退出容器。
启动已停止运行的容器
docker ps -a
后台运行
docker exec
(下面会介绍到)。停止一个容器
docker stop <容器 ID>
进入容器
docker attach 容器ID
docker exec 容器ID
导出和导入容器
镜像保存/载入
docker load/docker save
容器导入/导出
导出容器
docker export -o <保存路径> <容器标识>
docker export -o ./ubuntu.tar ubuntu:20.04
docker export 容器id/name >文件名.tar
导入容器快照
docker import <文件路径> <容器名>
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
docker rm
命令删除容器docker rm -f 容器ID
docker container prune
具体例子
运行一个Web应用
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker run -d -P training/webapp python app.py
#运行镜像
我们也可以通过 -p 参数来设置不一样的端口:
docker run -d -p 5000:5000 training/webapp python app.py
使用docker port 容器ID
可以查看容器端口的映射情况和容器内部的内容
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
查看WEB应用程序容器的进程
docker top [ID或者名字]
检查 WEB 应用程序,可以查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect [ID或者名字]
查询最后一次创建的容器
通过docker container ls
或docker ps
(该操作首先需要确定有容器在运行)来查看那些容器在运行
Docker容器连接
docker run -d -P training/webapp python app.py
我们使用 -P 绑定端口号,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port
命令可以让我们快捷地查看端口的绑定情况。Docker容器互联
docker run -d -P --name runoob training/webapp python app.py
docker ps -l
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
docker run -it --rm ubuntu cat etc/resolv.conf
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
docker run -it -v 主机目录:容器目录
docker run -d -P --name ubunut01 -v /home/demo:/home:ro ubuntu
docker run -d -P --name ubunut02 -v /home/demo:/home:rw ubuntu
docker run -it -v /home/demo:/home ubuntu /bin/bash
docket inspect 容器id
来查看卷的挂载信息(找到Mounts字段,其Source就是主机目录,Destination就是容器目录),若没有该字段,说明挂载失败,需要重新挂载docker run -it --name docker02 --volumes-from docker01 demo/ubunut:0.1
查看容器内部网络的ip地址命令:ip addr 【或者 ifconfig】
Docker关于网络的处理。
一个网络模型图
Docker使用的是Linux的桥接模式,宿主机中是一个Docker容器的网桥docker0,所有东西都是经过这个docker0的,只要你启动一个容器,不指定一个网络它就会往docker0这里给你分配一个IP,最多能分配65535个。
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)
如果是容器之间需要通信,那么就通过Veth-pair给转发连接过去,如下图所示。核心就是利用了Linux的虚拟化网络技术,在容器内和Docker0分别创建了一个虚拟网卡,通过Veth-pair进行一个连接。
为什么是65535个的原因:
因为docker0分配的ip后面有16,我们拿255.255.0.1/16为例,因为原有的为00000000.00000000.00000000.00000000,转化为十进制【255.255.255.255】而16表示的是截止到前面的第二个255,也就是【255.255.0.0】,而每位的范围是0~255个数,那么能存储的个数就为后面的位数相乘,也就是255*255=65535个。假如是255.255.0.1/24,那么就代表255.255.255.0,也就是只有最后的0-255个,也就是可分配255个。而我们的docker0课分配的个数就是65535个
容器互联 --link 【了解即可】
docker run -d -P --name tomcat03 --link tomcat02 tomcat
运行tomcat03并且连通tomcat02是可以的,并且通过docker exec -it tomcat03 ping tomcat02
可以ping通。docker exec -it tomcat02 ping tomcat03
就会ping失败通过docker network --help查看网络的相关命令
网络模式
直接使用–net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
以上命令就相当于
docker run -d -P --name tomcat01 --net bridge tomcat
docker0特点:默认,域名不能访问。 --ling可以打通,不建议使用
创建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mytestnet
参数说明:
–driver bridge # 桥接模式
–subnet 192.168.0.0/16 # 配制一个子网,65535个字段 192.168.0.2——192.168.255.255
–gateway 192.168.0.1 # 配制默认的路由网关
mytestnet #表示自定义的网络名
使用我们自定义的网络启动两个tomcat,然后查看一下信息。
启动tomcat-mytestnet-01
docker run -d -P --name tomcat-mytestnet-01 --net mytestnet tomcat
启动tomcat-net-02
docker run -d -P --name tomcat-mytestnet-02 --net mytestnet tomcat
查看一下
tomcat01 ping一下02的IP地址
docker exec -it tomcat-mytestnet-01 ping 192.168.0.3
tomcat02 ping一下01的IP地址
docker exec -it tomcat-mytestnet-02 ping 192.168.0.2
tomcat01 ping一下02的name
docker exec -it tomcat-mytestnet-01 ping tomcat-mytestnet-02
tomcat02 ping一下01的IP地址
docker exec -it tomcat-mytestnet-02 ping tomcat-mytestnet-01
发现可以ping通
网络联通connect
查看帮助命令:docker network connect --help
启动tomcat01,使用的是docker0路由
docker run -d -P --name tomcat01 tomcat
启动tomcat02,使用的是docker0路由
docker run -d -P --name tomcat02 tomcat
查看一下启动的容器
docker ps
测试tomcat01是否能ping通tomcat-net-01
docker exec -it tomcat01 ping tomcat-mytestnet-01
结果是不可以ping通
我们通过connect将两个不同网段的容器来ping通
docker network connect mytestnet tomcat01
然后再去ping
docker exec -it tomcat01 ping tomcat-mytestnet-01
这下就能ping通了,这里连通之后就是将tomcat01放到了mynet下【注意:tomcat-02依旧是打不通的】,就相当于下图所示。
使用connect就是将tomcat01放到了mynet下,如果我们以后想要跨网络操作别人的容器,就需要使用docker network connect
连通。
可以在Linux中ping通tomcat01容器,而且容器与容器之间是可以互相ping通的。
启动一个tomcat
经过测试,发现当我们启动一个容器的时候,会多一对网卡,上图中的8和容器的7是对应的。
启动容器带来的网卡是一对对的,这就是evth-pair,是一对虚拟设备接口,它们是成对出现的,一端连着协议,一端彼此连接。正是因为有这个特性,evth-pair才能充当一个桥梁,连接着各种虚拟网络设备。OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。同时发现Linux是可以ping通容器内部的。
原理:我们每启动一个docker容器,docker就会给容器分配一个ip地址,我们只要安装了docker就会有一个docker0的网卡,使用的是桥接模式bridge,使用的技术就是evth-pair技术。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mytestnet
docker run -d -P --name tomcat-testnet-01 --net mytestnet tomcat
docker run -d -P --name tomcat-testnet-02 --net mytestnet tomcat
# 创建一个dockerfile文件,名字可以随意,建议Dockerfile
# 编写dockerfile脚本
# 文件中的内容,指令需要大写
FROM ubuntu # 基础镜像
VOLUME ["volume01","volume02"] # 挂载卷的目录,这里没有指定
CMD echo "-------hello-------" # 生成完之后发一段消息
CMD /bin/bash # 生成完之后执行的命令
# 这里的每个命令就是镜像的一层
- 编写完成后使用以下命令来构建镜像
docker build -f /home/dockerfile -t demo/ubuntu:1.0 .
-f(from) 通过什么文件来构建,后面接构建文件的地址
-t 生成文件的版本
docker run -it --name docker01 demo/ubuntu:1.0
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上执行会创建 3 层镜像。可简化为以下格式:
# 以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
docker build -t nginx:v3 .
指令 | 解释 |
---|---|
FROM | 基础镜像,在此基础上开始构建 |
MAINTAINER | 指定维护者信息 姓名+邮箱 |
RUN | 构建镜像需要运行的命令 |
ADD | 步骤,添加内容 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承,DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令 |
COPY | 基类似ADD,将我们文件拷贝到镜像中 |
ENV | 构建的时候设置环境变量 |
COPY [--chown=:] <源路径1>... <目标路径>
COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
# 不传参运行
docker run nginx:test
# 容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
# 传参运行
docker run nginx:test -c /etc/nginx/new.conf
# 容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
$NODE_VERSION
引用:ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
# 书写内容
FROM centos # 首先会从本地查找该镜像,若没有会在网上下载
MAINTAINER 名字<邮箱> # 写作者,邮件
ENV MYPATH /usr/local # 设置环境变量
WORKDIR $MYPATH # 配置登录进行的路径,引用上面配置的
RUN yum -y install vim # 安装vim
RUN yum -y install net-tools # 安装网络工具
EXPOSE 80 # 暴露80端口
# 打印信息
CMD echo $MYPATH
CMD echo "--------END---------"
CMD /bin/bash
docker build -f dockerfile 文件路径 -t 镜像名:[tag]
docker build -f dockerfile -t mycentor:0.1 .