Docker基础
docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似手机app),更重要的是容器性能开销极低,无需为其单独创建底层系统支持,多个容器可共用一个系统
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
docker架构
docker的三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器
Docker 容器通过 Docker 镜像来创建。
概念
- Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板,比如Ubuntu系统。 - Docker 容器(Container)
容器是独立运行的一个或一组应用,是镜像运行时的实体。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 - Docker 仓库(Repository)
仓库可看成一个代码控制中心,用来保存镜像。提供了庞大的镜像集合供使用。 - Docker Registry
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 - Docker 客户端(Client)
Docker 客户端通过命令行或者其他工具使用 Docker SDK与 Docker 的守护进程通信。 - Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 - Docker Machine
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
手动安装Docker
安装依赖环境
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和lvm2
#device mapper是Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
镜像加速
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://(自己的加速地址).mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://2rixkbqr.mirror.aliyuncs.com"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
网络优化
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# systemctl restart network
[root@localhost ~]# systemctl restart docker
Docker基础命令
查看docker版本
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Sun Mar 14 17:03:45 2021
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Sun Mar 14 17:02:21 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker容器管理
run
创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
–name=“nginx-lb”: 为容器指定一个名称;
–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h “mars”: 指定容器的hostname;
-e username=“ritchie”: 设置环境变量;
–env-file=[]: 从指定文件读入环境变量;
–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
–link=[]: 添加链接到另一个容器;
–expose=[]: 开放一个端口或一组端口;
–volume , -v: 绑定一个卷
#使用docker镜像nginx:latest以后台模式启动一个容器(不指定标签默认latest),将容器80端口映射到宿主机80端口上,将宿主机/var/www/html目录映射到容器内/usr/local/nginx/html目录下。
docker run -p 80.80 -v /var/www/html:/usr/local/nginx/html -d nginx:latest
start/stop/restart
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
docker start mynginx
docker stop 7e8a #指定容器时可以指定容器名或ID,ID可不打全
docker restart mynginx
- run与start区别:
start是直接启动现有创建好的容器
run是查找是否有该镜像,若没有,先下载该镜像后,创建容器,并启动(等于集合了下载镜像、创建容器、启动容器三个步骤) - kill和stop区别:
相同点
docker stop和docker kill都可以终止运行中的docke 容器,都是通过信号量的方式来通知容器
不同点
docker stop:docker通过containerd先发送信号量到容器主进程,允许其在一定时间(默认10秒)内进行一些必要的回收操作,如果通过containerd收到了容器退出的消息则表示退出成功,如果这段时间没有收到容器退出的消息,则发送信号强行杀死容器,整个过程比较优雅
docker kill:docker通过containerd默认直接发送信号量,直接杀死容器,也可以通过-s命令发送其它信号量
上述两个命令类似于linux中的kill和kill -9这两个命令,kill与docker stop相似,kill -9与docker kill类似
kill
docker kill :杀掉一个运行中的容器。
docker kill -s KILL mynginx #-s KILL为指定信号量为KILL,可不加,默认KILL
rm
docker rm :删除一个或多个容器。(不加参数则容器不得处于运行状态)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
pause/unpause
docker pause :暂停容器中所有的进程。(例如容器内是数据库,将其停止服务)
docker unpause :恢复容器中所有的进程。
docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]
create
docker create :创建一个新的容器但不启动它。
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
选项、用法和run相同,区别在于不启动
exec
docker exec :在运行的容器中执行命令。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
选项:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开 ,通常-it配合使用
-t :分配一个伪终端
#在容器 mynginx 中开启一个交互模式的终端
docker exec -i -t mynginx /bin/bash #可指定容器名或容器ID
#容器 mynginx 中以交互模式执行容器内 /root/aa.sh 脚本:
docker exec -it mynginx /bin/sh /root/aa.sh
容器操作
ps
docker ps : 列出容器
docker ps [OPTIONS]
常用选项:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
–format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
–no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
- 容器有7种状态:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
inspect
docker inspect : 获取 容器/镜像 的元数据。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
选项:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
–type :为指定类型返回JSON。
#获取镜像mysql:5.6的元信息
docker inspect mysql:5.6
#获取容器mymysql的元信息
docker inspect mymysql
top
docker top :查看容器中运行的进程信息,支持 ps 命令参数。
docker top [OPTIONS] CONTAINER [ps OPTIONS]
docker top mynginx
##此时列出容器内所有进程信息,包括进程号、uid、gid等
attach
docker attach :连接到正在运行中的容器。(docker exec取代)
推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
docker attach [OPTIONS] CONTAINER
#连接到容器内
docker attach mynginx
#容器mynginx将访问日志指到标准输出,连接到容器查看访问信息。
docker attach --sig-proxy=false mynginx
169.254.187.100 - - [10/Jul/2016:16:54:26 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
events
docker events : 从服务器获取实时事件
docker events [OPTIONS]
选项:
-f :根据条件过滤事件;
–since :从指定的时间戳后显示所有事件;
–until :流水时间显示到指定的时间为止;
logs
docker logs : 获取容器的日志
docker logs [OPTIONS] CONTAINER
选项:
-f : 跟踪日志输出
–since :显示某个开始时间的所有日志
-t : 显示时间戳
–tail :仅列出最新N条容器日志
wait
docker wait : 阻塞运行直到容器停止,然后打印出它的退出代码。
docker wait CONTAINER
export
docker export :将文件系统作为一个tar归档文件导出到STDOUT。
docker export [OPTIONS] CONTAINER
选项:
-o :将输入内容写到文件。
#将id为a404c6c174a2的容器按日期保存为tar文件
docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
port
docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
#查看容器mynginx的端口映射情况。
docker port mymysql
3306/tcp -> 0.0.0.0:3306
容器rootfs命令
commit
docker commit :从容器创建一个新的镜像。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
#将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。
docker commit -a "aa" -m "my mysql" a404c6c174a2 mymysql:t1
cp
docker cp :用于容器与主机之间的数据拷贝。
#从容器拷贝到主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
#从主机拷贝到容器
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
选项:
-L :保持源目标中的链接
diff
docker diff : 检查容器里文件结构的更改。
#查看容器mymysql的文件结构更改。
docker diff mymysql
镜像仓库操作
login/logout
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login [OPTIONS] [SERVER] #不指定SERVER默认为Docker Hub
docker logout [OPTIONS] [SERVER]
-u :登陆的用户名
-p :登陆的密码
pull
docker pull : 从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-a :拉取所有 tagged 镜像
–disable-content-trust :忽略镜像的校验,默认开启
push
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]
–disable-content-trust :忽略镜像的校验,默认开启
search
docker search : 从Docker Hub查找镜像
docker search [OPTIONS] TERM
–automated :只列出 automated build类型的镜像;
–no-trunc :显示完整的镜像描述;
-f <过滤条件>:列出收藏数不小于指定值的镜像。
#从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像
docker search -f stars=10 java
本地镜像管理
images
docker images : 列出本地镜像。
docker images [OPTIONS] [REPOSITORY[:TAG]]
选项:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
rmi
docker rmi : 删除本地一个或多少镜像。
docker rmi [OPTIONS] IMAGE [IMAGE...]
-f :强制删除;(若不加该参数,只能删除未作为容器运行的镜像)
–no-prune :不移除该镜像的过程镜像,默认移除;
tag
docker tag : 标记本地镜像,将其归入某一仓库。
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag nginx:latest nginx:v1
##此时存在 nginx:latest 和 nginx:v1 两个镜像,即可理解为nginx仓库的的latest和v1
docker tag nginx:latest web:n1
##此时创建了web:n1镜像,即web仓库的n1镜像,该镜像与nginx:latest相同
build
docker build 命令用于使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH | URL | -
##使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
##也可以通过 -f Dockerfile 文件的位置:
docker build -f /path/to/a/Dockerfile . ##不要忘记“.”
history
docker history : 查看指定镜像的创建历史。
docker history [OPTIONS] IMAGE
-H :以可读的格式打印镜像大小和日期,默认为true;
–no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
save
docker save : 将指定镜像保存成 tar 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
-o :输出到的文件。
docker save -o mynginx_v1.tar mynginx:v1
load
docker load : 导入使用 docker save 命令导出的镜像。
docker load [OPTIONS]
–input , -i : 指定导入的文件,代替 STDIN。
–quiet , -q : 精简输出信息。
import
docker import : 从归档文件中创建新的镜像。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
利用该归档文件创建标签为web:n1的镜像
docker import mynginx_v1.tar web:n1
docker相关信息
info
docker info : 显示 Docker 系统信息,包括镜像和容器数。
version
docker version :显示 Docker 版本信息。
选项:
-f :指定返回值的模板文件。