【docker】Docker入门到实践 笔记

Docker入门到实践 笔记

基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

镜像

  • 特殊的文件系统
  • 不包含任何动态的数据
  • 采用Union FS技术,设计分层架构

容器

  • 镜像和容器就像“类”和“实例”的区别
  • 容器的实质是进程
  • 容器也是分层结构,存在容器存储层,为容器运行时读写而准备,生命周期和容器同步

仓库

  • Docker Registry(注册服务器):集中的存储、分发镜像的服务
  • 一个registry多个repository(仓库)
  • 一个repository(仓库)多个tag(标签)
  • 一个tag(标签)一个image(镜像)

常用操作

镜像

获取镜像

docker pull --help

运行镜像获得容器

docker run --help

列出镜像

docker image ls

虚悬镜像

docker image prune #删除虚悬镜像

中间层镜像

docker image ls -a #可以查看到

列出部分镜像

docker image ls [repo:tag]

列出镜像id

docker image ls -q

删除本地镜像

docker image rm --help  #删除tag是本质

镜像运行容器定制

docker run  --name webserver -d -p 81:80 nginx 
//用nginx镜像启动一个容器命名为webserver,并映射80端口,用http://localhost:81可直接访问(-p 宿主机端口:容器端口)
//进入容器 docker exec -it webserver bash
//退出容器 exit
//查看容器变动 docker diff webserver
//保存容器修改到镜像(容器存储层数据存储)docker commit

定制镜像

docker commit --help
//保存容器修改到镜像(容器存储层数据存储修)

查看镜像历史

docker history [repo:tag]

容器

启动容器

两种方式

  • 基于镜像新建容器
  • 将终止状态的容器重新启动

新建并启动

docker run ubuntu:18.04 /bin/echo 'Hello world'
//命令输出一个 “Hello World”,之后终止容器。

docker run -t -i ubuntu:18.04 /bin/bash
//-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
//-i 则让容器的标准输入保持打开。

docker run的后台逻辑

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止容器

docker container start

后台运行

  • -d参数决定
  • 启用后输出结果不在打印到宿主机上,可以在docker logs中查看
  • 返回唯一的id,可以通过docker container ls 查看
  • 查看输出信息 docker container logs
  • 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无 关。
#宿主机上输出
docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

#-d 后台运行,在docker logs中
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

终止容器

  • docker container stop 终止运行中的容器
  • docker容器中指定的应用终结时,容器自动终止。
  • 只启动了一个终端的容器调用exit,ctrl+d退出终端时,容器即终止。
#查看容器
docker container ls -a
#终止运行中的容器
docker container stop 
#终止状态容器重启 
docker container start
#运行状态容器重启 
docker container restart

进入容器

#attach方法
docker run -dit ubuntu
docker attach xxx //此时从stdin中exit,会导致容器停止。

#exec方法
docker run -dit ubuntu
docker exec -it 69d1 bash //从这个 stdin 中 exit,不会导致容器的停止

#更多方法
docker exec --help

导入导出容器

导出容器

#导出容器快照到本地文件
docker export 7691a814370e > ubuntu.tar

导入容器快照

#使用docker import 从容器快照文件中再导入为镜像
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker image ls

#也可以通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo

  • docker load 来导入镜像存储文件到本地镜像库
  • docker import 来导入一个容器快照到本地镜像库

这两者的区别在于:

  • 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)
  • 镜像存储文件将保存完整记录,体积也要大。
  • 从容器快照文件导入时可以重新指定标签等元数据信息。

删除和清理容器

#删除一个处于终止状态的容器
docker container rm trusting_newton

#删除一个处于运行中的容器
docker container rm -f xxxx //docker会发送SIGKILL信号给容器。

#清理所有处于终止状态的容器
docker container prune

仓库

  • 仓库( Repository )是集中存放镜像的地方。
  • 注册服务器( Registry )是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。
  • 仓库可以被认为是一个具体的项目或目录
  • 在dl.dockerpool.com/ubuntu 中dl.dockerpool.com 是注册服务器地址,ubuntu是仓库名。

Docker Hub

Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像

常用命令

docker search //查找官方仓库中的镜像
docker pull //下载到本地
docker push //将自己的镜像推送到 Docker Hub

自动创建

自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方 便。

私有仓库

  • 工具docker-registry

数据管理

容器中管理数据两种途径

  • 数据卷(Volumes)
  • 挂载主机目录(Bind mounts)

数据卷

  • 是一个可供一个或多个容器使用的特殊目录,它绕过UFS可以提供很多 有用的特性
  • 数据卷 可以在容器之间共享和重用
  • 对 数据卷 的修改会立马生效
  • 对 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的 被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷 。

常用操作

#创建一个数据卷 my-vol
docker volume create my-vol

#查看所有的 数据卷
docker volume ls

#在主机里使用以下命令可以查看指定 数据卷 的信息
docker volume inspect my-vol

#启动一个挂载数据卷的容器
#创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。
docker run -d -P --name web --mount source=my-vol,target=/webapp \ training/webapp \ 
python app.pyc
在一次 docker run 中可以挂载多个 数据卷

#查看数据卷的具体信息
#主机里使用以下命令可以查看 web 容器的信息
docker inspect web   //数据卷 信息在 "Mounts" Key 下面

#删除数据卷
docker volume rm my-vol

#清理数据卷
docker volume prune

  • 数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷
  • 并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷
  • 如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令

挂载主机目录

挂载一个主机目录作为数据卷, --mount标记可以指定挂载一个本地主机的目录到容器中去

#加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py

# read only只读
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,read
only \
training/webapp \
python app.py

#查看 web 容器的信息
docker inspect web

挂载一个本地主机文件作为数据卷

--mount 标记也可以从主机挂载单个文件到容器中

docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
#这样就可以记录在容器输入过的命令了

网络功能

Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

-P(大写)映射

  • -P (大写p)Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
  • docker container ls可以查看映射关系
#随机端口映射
docker run -d -P training/webapp python app.py

#查看映射关系
docker container ls -l

#查看应用信息
docker logs -f nostalgic_morse

-p(小写)映射

  • -p (小写)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。
  • 支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。
#映射所有接口地址
#hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口
docker run -d -p 5000:5000 training/webapp python app.py
#此时默认会绑定本地所有接口上的所有地址。

#映射到指定地址的指定端口
#ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如
localhost 地址 127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

#映射到指定地址的任意端口
#ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地
主机会自动分配一个端口。
docker run -d -p 127.0.0.1::5000 training/webapp python app.py

#指定端口映射协议
#用udp 标记来指定 udp 端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp pytho
n app.py

查看端口配置

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

docker port nostalgic_morse 5000

查看容器内部网络配置

  • 容器有自己的内部网络和 ip 地址
  • 使用 docker inspect 可以获取所有的变量
  • Docker 还可以有一个可变的网络配置

绑定多个端口

docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py

容器互联

新建网络

docker network create -d bridge my-net
#-d 参数指定 Docker 网络类型有 bridge overlay 
#其中 overlay 网络类型用于 Swarm mode

链接容器

#容器busybox1, 镜像源busybox, 网络my-net
docker run -it --rm --name busybox1 --network my-net busybox sh

#容器busybox2, 镜像源busybox, 网络my-net
docker run -it --rm --name busybox2 --network my-net busybox sh

#查看状态
docker container ls

#通讯验证,在busybox1中ping busybox2
ping busybox2

Docker Compose

如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。

配置 DNS(Domain Name System)

配置容器的主机名和DNS,Docker 利用虚拟文件来挂载容器的 3 个相关配置文件来实现,在容器中执行mount可以获得相关挂载信息

$ mount
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
tmpfs on /etc/resolv.conf type tmpfs ...
#该机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新。

配置所有容器的DNS

可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。

{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
#每次启动的容器 DNS 自动配置为 114.114.114.114 和 8.8.8.8
#使用以下命令来证明其已经生效。
docker run -it --rm ubuntu:18.04 cat etc/resolv.conf

手动指定容器配置

可以在使用 docker run 命令启动容器时加入如下参数:

  • -h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,
  • 它会被写到容器内的 /etc/hostname 和 /etc/hosts 。
  • 但它在容器外部看不到,既不会在docker container ls中显示,也不会在其他的容器的 /etc/hosts 看到。
  • --dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中
  • 让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
  • --dns-search=DOMAIN 设定容器的搜索域
  • 当设定搜索域为 .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com 。

注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的/etc/resolv.conf 来配置容器。

你可能感兴趣的:(docker,镜像,容器,仓库,网络配置,工具,docker,容器)