Docker
安装
#预备
apt-get update && apt-get install -y wget vim
海外服务器
#安装docker
wget -qO- get.docker.com | bash
#卸载docker
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
大陆服务器
#安装docker
curl -sSL https://get.daocloud.io/docker | sh
#安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
#卸载docker
sudo apt-get remove docker docker-engine
rm -fr /var/lib/docker/
简介
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker使用
Hello World
docker run ubuntu:15.10 /bin/echo "Hello world"
#or
docker run hello-world
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果
docker ps查看容器详情
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
docker logs 命令,查看容器内的标准输出
docker logs 容器id
docker logs 容器name
docker stop 容器id
docker stop 容器name
容器使用
#查看所有命令选项
docker
#了解指定的 Docker 命令使用方法
docker command --help
#拉取镜像
docker pull ubuntu
#使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器
docker run -it ubuntu /bin/bash
#exit退出
exit
- -i: 交互式操作。
- -t: 终端。
- -d 参数后台运行,默认不会进入容器,想要进入容器需要使用指令 docker exec
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,交互式 Shell,因此用的是 /bin/bash。
#后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
#停止容器
docker stop <容器 ID>
#重启容器
docker restart <容器 ID>
#如果从这个容器退出,会导致容器的停止
docker attach 1e560fca3906
#如果从这个容器退出,容器不会停止
docker exec -it 243c32535da7 /bin/bash
#导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
docker export 1e560fca3906 > ubuntu.tar
#使用 docker import 从容器快照文件中再导入为镜像,将快照文件 ubuntu.tar 导入到镜像test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
#通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
#删除容器
docker rm -f 1e560fca3906
#清理掉所有处于终止状态的容器
docker container prune
# 载入镜像
docker pull training/webapp
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
#查看WEB应用程序日志
docker logs -f bf08b7f2cd89
#查看容器内部运行的进程
docker top wizardly_chandrasekhar
#查看容器的配置和状态信息
docker inspect wizardly_chandrasekhar
**-P:**将容器内部使用的网络端口随机映射到我们使用的主机上,也可以指定端口
-p: 本地端口:容器端口
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
docker ps 命令可以查看到容器的端口映射
docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
镜像使用
docker images 来列出本地主机上的镜像
- **REPOSITORY:**表示镜像的仓库源
- **TAG:**镜像的标签
- **IMAGE ID:**镜像ID
- **CREATED:**镜像创建时间
- **SIZE:**镜像大小
#拉取镜像
docker pull ubuntu:13.10
#查找镜像
docker search httpd
#运行镜像
docker run httpd
#删除镜像
docker rmi hello-world
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
创建镜像
修改镜像
#创建容器
docker run -t -i ubuntu:15.10 /bin/bash
#进入容器修改后
#提交容器
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
- -m: 提交的描述信息
- -a: 指定镜像作者
- **e218edb10161:**容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
docker images可以看到新的镜像
#使用新镜像 runoob/ubuntu 来启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。为此,需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建镜像。
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的
FROM 构建镜像基于哪个镜像
MAINTAINER 镜像维护者姓名或邮箱地址
RUN 构建镜像时运行的指令
CMD 运行容器时执行的shell环境
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
USER 为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH 健康检查
ARG 构建时指定的一些参数
EXPOSE 声明容器的服务端口(仅仅是声明)
ENV 设置容器环境变量
ADD 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT 运行容器时执行的shell命令
- CMD 在docker run 时运行。
- RUN 是在 docker build。
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
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 命令来构建一个镜像
docker build -t runoob/centos:6.7 .
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签
# 镜像ID 用户名称/镜像源名:标签名(tag)
docker tag 860c279d2fec runoob/centos:dev
容器连接
#默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp
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
#使用 --name 标识来命名容器
docker run -d -P --name runoob training/webapp python app.py
新建网络
#创建一个新的 Docker 网络
docker network create -d bridge test-net
-d:参数指定 Docker 网络类型,有 bridge、overlay
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
#可以相互ping到
apt-get update
apt install iputils-ping
#指定容器DNS
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。
如果在容器启动时没有指定 –dns 和 –dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS
主机dns配置: /etc/docker/daemon.json
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
仓库管理
#登录需要输入用户名和密码,可以从 docker hub 上拉取自己账号下的全部镜像
docker login
#退出
docker logout
#推送镜像
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
docker search username/ubuntu
Docker Compose
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
#后台运行容器
docker-compose up -d
Docker Machine
Docker Machine 是一种可以在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
chmod +x /usr/local/bin/docker-machine
#列出可用的机器
$ docker-machine ls
#创建一台名为 test 的机器 --driver:指定用来创建机器的驱动类型,这里是 virtualbox
$ docker-machine create --driver virtualbox test
#查看机器的 ip
$ docker-machine ip test
#停止机器
$ docker-machine stop test
#启动机器
$ docker-machine start test
#进入机器
$ docker-machine ssh test
命令
ps
$docker ps [OPTIONS]
OPTIONS说明:
- **-a 😗*显示所有的容器,包括未运行的。
- **-f 😗*根据条件过滤显示的内容。
- **–format 😗*指定返回值的模板文件。
- **-l 😗*显示最近创建的容器。
- **-n 😗*列出最近创建的n个容器。
- **–no-trunc 😗*不截断输出。
- **-q 😗*静默模式,只显示容器编号。
- **-s 😗*显示总的文件大小
inspect
$docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS说明:
- **-f 😗*指定返回值的模板文件。
- **-s 😗*显示总的文件大小。
- **–type 😗*为指定类型返回JSON。
kill
docker kill :杀掉一个运行中的容器
$docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
- **-s 😗*向容器发送一个信号
rm
$docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
- **-f 😗*通过 SIGKILL 信号强制删除一个运行中的容器。
- **-l 😗*移除容器间的网络连接,而非容器本身。
- **-v 😗*删除与容器关联的卷。
pause/unpaus
docker pause :暂停容器中所有的进程。
docker unpause :恢复容器中所有的进程。
exec
$docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
- **-d 😗*分离模式: 在后台运行
- **-i 😗*即使没有附加也保持STDIN 打开
- **-t 😗*分配一个伪终端
top
查看容器中运行的进程信息,支持 ps 命令参数
$docker top [OPTIONS] CONTAINER [ps OPTIONS]
info
显示 Docker 系统信息,包括镜像和容器数。。
$docker info [OPTIONS]
Q.E.D.