目录
第一章 docker 安装
第二章 docker 镜像加速
第三章 docker 镜像管理
第四章 docker 镜像命令
第五章 docker 容器命令
第六章 docker 容器网络访问(端口映射)
第七章 docker 数据卷管理
第八章 docker 容器互联
1、Docker解决了什么问题.
- 快速交付和部署(镜像与容器)
- 资源的高效利用和隔离(高密度部署)
- 轻松的迁移和扩展(一次封装,到处运行)
1586322129437.png
2、容器化对比虚拟机
对比属性 | Container | VM |
---|---|---|
隔离性 | 基于进程隔离 | 提供资源的完全隔离 |
启动时间 | 秒级 | 分钟级 |
内核 | 共用宿主机内核 | 使用独立内核 |
占用资源 | MB级 | GB级 |
系统支持容量 | 单机支持上千个容器 | 一般几十个 |
3.docker 虚拟化理论
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace 资源隔离
cgroups 进程的资源限制
kvm 虚拟磁盘文件,资源隔离
kvm 资源限制,--cpus --memory
4.docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,向mysql一样
命令:docker version
[root@controller ~]# docker version
Client: Docker Engine - Community
Version: 23.0.2
API version: 1.42
Go version: go1.19.7
Git commit: 569dd73
Built: Mon Mar 27 16:18:54 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.2
API version: 1.42 (minimum version 1.12)
Go version: go1.19.7
Git commit: 219f21b
Built: Mon Mar 27 16:16:31 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.20
GitCommit: 2806fc1057397dbaeefbea0e4e17bddfbd388f38
runc:
Version: 1.1.5
GitCommit: v1.1.5-0-gf19387a
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
image.png
第一章 docker 安装
# 清楚旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 下载yum源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker server client 最新稳定版本
yum install docker-ce docker-ce-cli containerd.io
# 指定安装哪个版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce- docker-ce-cli- containerd.io
# 启动docker&加入开机自启
systemctl start docker
systemctl enable docker
# 查看版本
docker version
# 查看详细信息
docker info
第二章 docker 镜像加速
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行
部署服务,环境问题、一次构建,处处运行 、docker是一种软件的打包技术
加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://sg60ky37.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
第三章 docker 镜像管理
选镜像的建议:
1,优先考虑官方
2,stars数量多
官方镜像仓库地址:http://hub.docker.com
获取镜像 docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,
Docker 中国官方镜像加速:[https://registry.docker-cn.com](https://registry.docker-cn.com)
官方pull docker pull centos:8(没有指定版本,默认会下载最新版)
私有仓库pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
第四章 docker 镜像命令
搜索镜像
docker search
查看镜像列表
docker images or docker image ls
删除镜像
docker rmi 例子:docker image rm centos:latest
导出镜像
docker save 例子:docker image save centos -o docker-centos7.tar.gz
导入镜像
docker load 例子:docker image load -i docker-centos7.tar.gz
查看详情
docker inspect 例子: docker inspect image_name[:tag]
第五章 docker 容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 常用选项
-d 守护态运行,放在后台
-p Publish a container's port(s) to the host ( container和host端口映射)
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb" 为容器指定一个名称
-v, --volume value 源地址(宿主机):目标地址(容器)
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
运行容器***
docker run image_name
docker run ==== docker create + docker start
启动容器
docker start ID或NAME
停止容器
docker stop ID或NAME
杀死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
查看容器的详细信息
docker inspect 容器ID
进入正在运行的容器(目的,调试,排错)
*** docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
删除容器
docker rm
批量删除容器
docker rm -f `docker ps -a -q`
查看运行日志
docker logs container_id/container_name
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
业务在容器中运行:初始命令,夯住,启动服务
第六章 docker容器的网络访问(端口映射)
docker0:172.17.0.1 jumpserver:172.17.0.2 nginx:172.17.0.3
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
docker run -p hostPort:containerPort
docker run -p ip:hostPort:containerPort 多个容器都想使用8080端口
docker run -p ip::containerPort(随机端口)
docker run -p hostPort:containerPort/udp
docker run -p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
docker run -p 81:80 –p 443:443 可以指定多个-p
随机映射
docker run -P (随机端口)
通过iptables来实现的端口映射
第七章 docker 数据卷管理
1.将主机操作系统目录直接映射进容器,类似于Linux中的mount。数据卷很好的解耦了容器应用和数据。对数据卷内数据的操作(无论是在本地主机还是容器内),都会立即生效。
docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql1 mysql:5.7
-v hostDir:containerDir
:hostDir不存在会自动创建,默认权限是rw,也可以改为ro,这样容器内部就无法对数据卷的数据进行修改了。
# 数据卷创建
docker volume create [OPTIONS] [VOLUME]
docker volume create hello
docker run -d -p 3307:3306 -v hello:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
# 数据卷列表
docker volume ls
# 数据卷详情
docker volume inspect hello
[
{
"CreatedAt": "2020-04-08T06:43:08Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/hello/_data",
"Name": "hello",
"Options": {},
"Scope": "local"
}
]
数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
--volumes-from(跟某一个已经存在的容器挂载相同的卷)
2.docker cp 用于容器与主机之间的数据拷贝
# 容器拷贝到本地
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 本地拷贝到容器
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
- `SRC_PATH` 指定为一个文件
- `DEST_PATH` 不存在:文件名为 `DEST_PATH`,内容为SRC的内容
- `DEST_PATH` 不存在并且以 `/` 结尾:报错
- `DEST_PATH` 存在并且是文件:目标文件内容被替换为SRC_PATH的文件内容。
- `DEST_PATH` 存在并且是目录:文件复制到目录内,文件名为SRC_PATH指定的名字
- `SRC_PATH` 指定为一个目录
- `DEST_PATH` 不存在:`DEST_PATH`创建文件夹,复制源文件夹内的所有内容
- `DEST_PATH` 存在是文件:报错
- `DEST_PATH` 存在是目录
- `SRC_PATH` 不以 `/.` 结束:源文件夹复制到目标里面
- `SRC_PATH` 以 `/.` 结束:源文件夹里面的内容复制到目标里面
自动创建文件夹不会做递归。把父文件夹做好
3.数据卷容器
如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但他专门用来提供数据卷供其他容器挂载。
docker run -it -v /idata --name idata ubuntu
docker run -it --volumes-from idata --name d01 ubuntu
docker run -it --volumes-from idata --name d02 ubuntu
#使用--volumes-from参数所挂载的数据卷容器本身不需要保持在运行状态
4.数据卷的用法细节
docker run -d -P --name nginx nginx
#方便修改nginx的配置和html页面等
#容器中 /usr/share/nginx/html
#容器中 /etc/nginx
# 参照一下各种写法
# hostPath:containerPath
docker run -d -P --name nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
# 为什么看到的是403而不是index页面内容。原来容器里面变为空了?
# 主机的内容复制到容器中,导致,容器同步到了主机的空文件夹。
# 特别是配置问题,必须提前保证我们主机挂载的目录里面提前有内容。
docker run -d -P --name nginx -v /opt/nginx:/etc/nginx nginx
#为什么docker ps看不到;出错了。open() "/etc/nginx/nginx.conf" failed (2: No such file or directory) nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
# 我就想自定义挂载路径,并且把他们挂载出来?
# 1、复制容器的文件
docker cp
1、启动一个nginx,先不挂载。
2、docker cp把运行中的nginx的内容复制出来
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp nginx:/usr/share/nginx/html /opt/hahanginx
nginx:/usr/share/nginx/html/. 把html里面的内容复制到 /opt/hahanginx
nginx:/usr/share/nginx/html 把html文件夹复制到 /opt/hahanginx
完整过程
mkdir /opt/nginx
docker cp nginx:/usr/share/nginx/html /opt/nginx 复制html
docker cp nginx:/etc/nginx/. /opt/nginx/conf
docker run -d -P --name nginx -v /opt/nginx/conf:/etc/nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
# 匿名卷方式volume,挂载任意目录
docker run -d -P --name nginx02 -v 容器路径
eg:
docker run -d -P --name nginx02 -v /usr/share/nginx/html -v /etc/nginx nginx
想要知道到底迎合到主机的哪里了?
docker inspect nginx02.
"Mounts": [
{
"Type": "volume",
"Name": "9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf",
"Source": "/var/lib/docker/volumes/9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32",
"Source": "/var/lib/docker/volumes/68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
#匿名挂载的缺点?不好维护。 docker volume可以维护他们
docker volume ls
#具名挂载。有卷。如果有可视化界面。我们就知道卷是干嘛,就不乱删除了。
#创建好的卷,会自动的和容器中需要挂载的这个文件夹做好同步。
docker volume create 卷名字, 创建一个卷。/var/lib/docker/volumes/自定义的卷名/_data
docker run -d -P --name nginx03 -v nginxconf:/etc/nginx -v nginxhtml:/usr/share/nginx/html nginx
最佳实战。
怎么判断挂载的是卷名而不是本机目录名
不以/开始就是卷名,以/开始就是主机名。
#改变文件的读写权限
#ro:readonly rw:readwrite; 指定容器对我们这个挂载出来的内容的读写权限
docker run -d -P --name nginx04 -v nginx04conf:/etc/nginx:ro -v nginx04html:/usr/share/nginx/html:rw nginx
ro:效果
root@c721b01b2752:/etc/nginx# echo 123 > nginx.conf
bash: nginx.conf: Read-only file system
容器内不能再对ro指定的所有进行修改了。
第八章 docker 容器互联
1、端口映射
docker create -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name hello-mysql mysql:5.7
-p HostPort:ContainerPort | IP:HostPort:ContainerPort | HostPort:ContainerPort
- 查看端口映射
- docker port hello-mysql
2、容器互联
--link name:alias
,name连接容器的名称,alias连接的别名
场景:我们无需暴露mysql的情况下,让web应用使用mysql;
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d --link mysql01:mysql --name tomcat tomcat:7
docker exec -it tomcat bash
cat /etc/hosts