Docker 包括三个基本概念:
-
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
简单运行
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令
容器启动参数
-
-t: 在新容器内指定一个伪终端或终端。
-
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
-
-d: 后台模式,以进程方式运行。输出为容器 ID,通过docker ps命令查看
-
进入容器:
-
docker attach:
-
docker exec:不会导致容器的停止。
-
-
-P: 将容器内部使用的网络端口随机映射到我们使用的主机上。
-
-p:指定映射端口
-
docker port ID:查看指定容器端口
-
-
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
容器
-
获取镜像:
$ docker pull ubuntu
-
启动容器:
$ docker run -it ubuntu /bin/bash
-
启动已停止运行的容器:
$ docker start ContainerID
-
停止一个容器:
$ docker stop <容器 ID>
-
重启:
$ docker restart <容器 ID>
-
删除容器:
$ docker rm -f <容器 ID>
镜像
-
列出镜像列表:
docker images
-
获取一个新的镜像:
$ docker pull ubuntu:13.10
-
查找镜像:
$ docker search ubuntu
-
下载镜像:
$ docker pull ubuntu
-
删除镜像:
$ docker rmi ubuntu
-
创建镜像:
-
从已经创建的容器中更新镜像,并且提交
-
运行中的容器中使用apt-get update 命令进行更新,并提交
-
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
-
-m: 提交的描述信息
-
-a: 指定镜像作者
-
e218edb10161:容器 ID
-
runoob/ubuntu:v2: 指定要创建的目标镜像名
-
-
使用 Dockerfile 指令来创建一个新的镜像
-
创建一个 Dockerfile 文件
-
通过 docker build 命令构建镜像
$ docker build -t runoob/centos:6.7 .
-
-t :指定要创建的目标镜像名
-
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
-
-
-
设置镜像标签:
$ docker tag 860c279d2fec runoob/centos:dev
容器连接
网络端口映射
-
-P :是容器内部端口随机映射到主机的端口。
-
-p : 是容器内部端口绑定到指定的主机端口。
查看端口的绑定情况:docker port
Docker 容器互联
-
容器命名
-
使用 --name 标识来命名容器
-
-
新建网络:
$ docker network create -d bridge
test-net
-
-d:参数指定 Docker 网络类型,有 bridge、overlay。
-
-
连接容器:
-
运行时添加参数指定网络
--network
test-net
-
使用
ping
命令验证连接
-
-
配置DNS:
-
宿主机
/etc/docker/daemon.json
-
手动指定容器的配置
-
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=
test.com
ubuntu
-
--rm:容器退出时自动清理容器内部的文件系统。
-
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
-
--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
-
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
-
-
仓库管理
-
登陆:
$ docker login
-
退出:
$ docker logout
-
推送:
-
$ docker tag ubuntu:18.04 username/ubuntu:18.04
-
$ docker push username/ubuntu:18.04
-
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
SpringBoot应用部署 - docker镜像打包,运行和管理
FROM openjdk:8-jre # 基镜像一般采用openjdk MAINTAINER wsy # 创建镜像的作者,一般是作者邮件地址 WORKDIR / # WORKDIR指令设置Dockerfile中的任何RUN,CMD,ENTRPOINT,COPY和ADD指令的工作目录。 ADD target/springboot-demo-helloworld.jar app.jar # 表示将jar包添加到镜像中,并重命名app.jar EXPOSE 8080 # 表示暴露的端口是8080 ENTRYPOINT ["java", "-jar"] # 表示启动时运行 java -jar CMD ["app.jar"] # 表示参数,这里是运行的具体的jar
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。
-
使用 YML 文件来配置应用程序需要的所有服务。
-
使用命令,从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境。
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
-
最后,执行
docker-compose up
命令来启动并运行整个应用程序。
yml 配置
镜像分层
Docker
镜像是由一系列层来构成的,每层代表Dockerfile
中的一条指令
FROM ubuntu:18.04 COPY . /app RUN make /app CMD python /app/app.py
该Dockerfile
包含四个命令,每个命令都会新创建一个层。
-
FROM
语句会从ubuntu:18.04
镜像创建一个层。 -
COPY
指令会从Docker
客户端的当前目录下添加一些文件。 -
RUN
指令使用了make
指令来构建。 -
CMD
是☞在容器中运行什么命令。
创建新容器时,每一层都会彼此堆叠,可以在基础层的基础上添加新的可写容器层。对容器的所做的所有更改都将写入到该可写容器层中。
下图显示了基于Ubuntu 15.04
的容器。对于Image layers
都是Read Only
的。
容器和层
对于容器和镜像(container
和image
)的主要区别就是顶部的可写层(the top writable layer
),在容器中添加数据或者修改现有数据的所有读写操作都会存储在此可写层中。删除容器后,可写层也会被删除,而基础镜像则保持不变。
每个容器都会有自己的可写层,所有的改变都存储在该容器层中。多个容器可以共享对同一基础镜像的访问,但可以拥有自己的数据状态。
资料
遇到的问题:
外部访问容器
Docker 启动后无法访问
原因:启动时未指定端口
docker run -itd -p 8081:8080 --name myContainerName <imageID>
-
本地的 8081 端口映射到容器的 8080 端口
-
hostPort:containerPort: 映射所有接口地址
-
ip:hostPort:containerPort: 映射到指定地址的指定端口
-
ip::containerPort: 映射到指定地址的任意端口