文章目录
Docker 概述
常用网址
Docker 是基于 Go 语言开发的 开源项目。
官网:https://www.docker.com/
文档地址:https://docs.docker.com/ Docker文档非常详细!
作用
虚拟机技术
虚拟机技术缺点:
- 资源占用大
- 冗余步骤多
- 启动缓慢
容器化技术
容器化技术不是模拟的一个完整操作系统
Docker与虚拟机技术的不同:
- 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在 宿主机的内核,容器是没有自己的内核的,也没有虚拟硬件,所以轻便
- 每个容器间是互相隔离的,每个容器内部都有一个属于自己的文件系统,互不影响
DevOps (开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker后,部署应用就和搭积木一样,很简便
项目打包为一个镜像,扩展 服务器A,服务器B
更简单的系统运维
在容器化开发后,开发和测试环境都是高度一致的!
更搞笑的计算资源利用
Docker 是内核级的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被压榨到极致
Docker安装
Docker的基本组成
镜像(Image)
docker镜像好比是一个模板,可以通过这个模块来创建容器服务,可以通过这个镜像创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container)
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的
启动,停止,删除,基本命令
目前可以把这个容器理解为就是一个简易的linux系统
仓库(repository)
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
Docker Hub(默认是国外的)
可以通过阿里云等容器父亲(配置镜像加速访问)
安装Docker
环境准备
- 首先需要会一些Linux基础
- 我使用的是CentOS7的Linux系统
- 使用了FinalShell远程连接服务器
环境查看
# 系统内核 3.10 以上
[root@VM-8-9-centos ~]# uname -r
3.10.0-1160.31.1.el7.x86_64
# 系统版本
[root@VM-8-9-centos ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
帮助文档https://docs.docker.com/engine/install/centos/
# 1. 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 安装新版本
yum install -y yum-utils
# 3. 设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的!
# 咱们使用阿里云镜像 国内镜像较快!
yum-config-manager \
--add-repo \
http: / /mirrors.aliyun.com/docker-ce/7inux/centos /docker-ce.repo
# 4. 安装docker相关内容 docker-ce 社区 docker-ee 企业版
yum makecache fast # 更新一下索引
yum install docker-ce docker-ce-cli containerd.io
# 5. 启动docker
systemctl start docker
# 6. 使用docker version查看是否安装成功
docker version
# 7. 测试运行 hello-world
docker run hello-world
# 8. docker images 查看镜像
docker images
卸载
# 1. 卸载依赖
yun remove docker-ce docker-ce-cli containerd.io
# 2。 删除资源
rm -rf /var/lib/docker # docker的默认工作路径
阿里云镜像加速
-
登录阿里云 找到 容器镜像服务
-
选择 镜像加速器
-
配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vnvb02sv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾HelloWorld流程
run 运行流程图
底层原理
Docker工作方式
Docker是一个 Client-Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。
Docker-Server 接收到 Docker-Client 的指令,就会去执行这个指令。
Docker为什么比 虚拟机 快呢?
-
Docker有着比虚拟机更少的抽象层。
-
Docker 使用的是宿主机的内核!而虚拟机是需要模拟一个内核!
创建一个新的容器时,docker不需要重新加载一个操作系统内核, 避免一些引导性操作。虚拟机需要加载Guest OS,分钟级别,比较慢,而docker利用宿主机操作系统,省略该过程,秒级启动!
Docker常用命令及工具
帮助命令
docker version #版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令
镜像命令
查看本机镜像 docker images
># docker image
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
#解释
REPOSITORY #镜像的仓库源
TAG #镜像的标签
IMAGE ID #镜像的id
CREATED #镜像的创建时间
SIZE #镜像的大小
#OPTIONS
-a,--a; #列出所有的镜像
-q,--quiet #只显示镜像的id
搜索镜像 docker search
># docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12234 [OK]
mariadb MariaDB Server is a high performing open sou… 4699 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 907 [OK]
# 可选项 通过搜索来过滤
--filter=STARS=3000 #搜索出来的镜像是STARS大于3000的
拉取镜像 docker pull
docker pull 镜像名 [:tag]
#下载镜像
># docker pull mysql
Using default tag: latest #不写tag,默认下载最新版
latest: Pulling from library/mysql
b4d181a07f80: Pull complete #采用分层下载 docker image的核心!! 联合文件系统
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
9ecc8abdb7f5: Pull complete
ad042b682e0f: Pull complete
71d327c6bb78: Pull complete
165d1d10a3fa: Pull complete
2f40c47d0626: Pull complete
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价命令
># docker pull mysql
># docker.io/library/mysql:latest
#指定下载版本
># docker pull mysql:5.7
b4d181a07f80: Already exists #分层,只下载不同的内容,联合文件系统
a462b60610f5: Already exists
578fafb77ab8: Already exists
524046006037: Already exists
d0cbe54c8855: Already exists
aa18e05cc46d: Already exists
32ca814c833f: Already exists
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除镜像 docker rmi
># docker rmi -f 5c62e459e087 #删除指定容器
#结果
Untagged: mysql:latest
Untagged: mysql@sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b
Deleted: sha256:5c62e459e087e3bd3d963092b58e50ae2af881076b43c29e38e2b5db253e0287
Deleted: sha256:b92a81bddd621ceee73e48583ed5c4f0d34392a5c60adf37c0d7acc98177e414
Deleted: sha256:265829a9fa8318ae1224f46ab7bc0a10d12ebb90d5f65d71701567f014685a9e
Deleted: sha256:2b9144b43d615572cb4a8fb486dfad0f78d1748241e49adab91f6072183644e9
Deleted: sha256:944ffc10a452573e587652116c3217cf571a32c45a031b79fed518524c21fd4f
Deleted: sha256:b9108f19e3abf550470778a9d91959ce812731d3268d7224e328b0f7d8a73d26
># docker rmi -f $(docker images -qa) #删除所有镜像
删除指定的容器:docker rmi -f <ID>
删除多个容器:docker rmi -f <ID1> <ID2> ...
删除所有容器:docker rmi -f $(docker images -qa)
提交镜像 docker commit
docker commit #提交容器称为一个新的副本
docker commit -m="提交的描述" -a="作者" 容器id 目标镜像名:[TAG]
容器命令
有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
运行容器 docker run
#docker run [OPTIONS] image
#参数说明
--name="Name" #容器名字
,tomcat02 用来区分容器
-d #后台运行方式
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写P) #随机指定端口
前台启动并进入容器
#启动并进入容器
[root@VM-8-9-centos ~]# docker run -it centos /bin/bash
[root@851eb2068038 /]# ls #基础版本,很多命令都不是很完善
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@851eb2068038 /]# exit #退出centos容器到主机
exit
[root@VM-8-9-centos ~]:~# docker ps #查看当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
后台启动容器
# 后台启动容器 docker run -d [镜像名]
[root@VM-8-9-centos ~]# docker run -d centos
599b658a7b67644cbefb08c37cffc8fd03ed0788079aabddd262b2ceccc168df
# 发现centos这个容器是停止的!
[root@VM-8-9-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 注意:docker 容器使用后台运行,就必须要有一个前台进程
注意:docker 容器使用后台运行,就必须要有一个前台进程
查看运行的容器 docker ps
# docker ps 参数
#列出当前正在与运行的容器
-a #列出当前正在运行的容器,并列出历史运行过的容器
-n=? #显示最近创建的容器
-q #显示容器的编号
[root@VM-8-9-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-8-9-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
851eb2068038 centos "/bin/bash" 7 minutes ago Exited (0) 4 minutes ago bold_kepler
9c3a5dae7bf4 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago gifted_kapitsa
d600d6322ff7 redislabs/rejson:latest "docker-entrypoint.s…" 2 weeks ago Exited (137) 13 days ago redis-redisjson
c35ca3ead5d8 redislabs/rejson:latest "docker-entrypoint.s…" 2 weeks ago Exited (0) 13 days ago great_dhawan
[root@VM-8-9-centos ~]# docker ps -aq
851eb2068038
9c3a5dae7bf4
d600d6322ff7
c35ca3ead5d8
退出容器
exit
退出容器并退出- 按下
Ctrl
+p
+q
容器不停止,退出
删除容器 docker rm
# 不能删除正在运行的容器若需要则-rf
docker rm 容器id #删除指定容器
docker rm 容器id -rf #删除指定容器(强制)
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q | xargs docker rm #删除所有容器
启动和停止的操作
docker start 容器id #启动过容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
其他常用命令
查看日志 docker logs
帮助文档
Usage: docker logs [OPTIONS] CONTAINER
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m
for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g.
42m for 42 minutes)
示例
# 启动docker,执行shell脚本打印"guokun"
[root@VM-8-9-centos ~]# docker run -d centos /bin/sh -c "while true;do echo guokun;sleep 1;done"
cc5f796c45d3eb66f7744dff504b9ff5ebd0325319d3dd25c921dd5df2621b30
# docker ps 找到执行的容器id
[root@VM-8-9-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc5f796c45d3 centos "/bin/sh -c 'while t…" 5 seconds ago Up 4 seconds beautiful_carver
489bfb086173 centos "/bin/bash" 6 minutes ago Up 6 minutes affectionate_thompson
# 查看5条日志
[root@VM-8-9-centos ~]# docker logs -tf --tail 5 cc5f796c45d3
2022-03-28T02:07:12.255984892Z guokun
2022-03-28T02:07:13.258016459Z guokun
2022-03-28T02:07:14.260114633Z guokun
2022-03-28T02:07:15.262239508Z guokun
2022-03-28T02:07:16.264209183Z guokun
查看容器中进程信息 docker top
[root@VM-8-9-centos ~]# docker top cc5f796c45d3
UID PID PPID C STIME TTY TIME CMD
root 21597 29164 0 11:28 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 29164 29144 0 10:05 ? 00:00:01 /bin/sh -c while true;do echo guokun;sleep 1;done
[root@VM-8-9-centos ~]# docker top 489bfb086173
UID PID PPID C STIME TTY TIME CMD
root 19708 19689 0 09:59 pts/0 00:00:00 /bin/bash
查看镜像元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID…]
[root@VM-8-9-centos ~]# docker inspect 489bfb086173
[
{
"Id": "489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd",
"Created": "2022-03-28T01:59:22.236726649Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 19708,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-03-28T01:59:22.571708887Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/www/server/docker/containers/489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd/resolv.conf",
"HostnamePath": "/www/server/docker/containers/489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd/hostname",
"HostsPath": "/www/server/docker/containers/489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd/hosts",
"LogPath": "/www/server/docker/containers/489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd/489bfb086173521b043695aa0094f0f89889408b7cc03215145403db566c6ffd-json.log",
"Name": "/affectionate_thompson",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
}
},
"NetworkMode": "default",
"PortBindings": {
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,