Docker基础
介绍
Docker组成
- Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点 Docker 服务端(Server): Docker守护进程,运行docker容器 docker engine
- Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
- Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库 harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中 的程序启动后生成的进程
Docker的核心是namespace和cgroup
6个namespace
MNT 磁盘和挂载隔离
User 用户和组隔离
UTS 内核,主机名和网络隔离
Net 网络隔离
IPC 进程间通信隔离
PID 进程隔离
操作内核版本要大于等于3.8
cgroup主要是各种资源限制
Docker和VM的差别
docker的优势:
部署快。可以短时间内部署成百上千台,迁移方便,可以在本地配置好。直接上传镜像。开发测试生产直接用一套就行。更好的实现面向服务,虚拟化性能好,没有损耗,节省开支
缺点:
隔离性能差,和宿主机进程也是隔离的,每次都需要进入容器查看,每一个容器需要查看或者调试的时候,都需要安装相应的工具
操作工具
其他三个是需要作用于守护进程,然后再通过交互,docker engine才会调用runc来启动container。podman是直接作用于容器
docker的运行机制
Docker安装和基础操作
[root@ubuntu ~]#curl -fsSL get.docker.com -o get-docker.sh
[root@ubuntu ~]#sh get-docker.sh --mirror Aliyun
docker连接方式,本地通过socket文件进行连接,外部机器通过ip+端口网络连接
Docker配置优化
1.镜像加速
找的阿里云,每个人的账号下的阿里云加速路径都不一样,可以自己生成一个
[root@kv1 docker]#sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://inwpakr3.mirror.aliyuncs.com"]
}
EOF
[root@kv1 docker]#systemctl restart docker
2.远程管理
-H, --host=[unix:///var/run/docker.sock]: tcp://[host]:[port][path] to bind or unix://[/path/to/socket] to use.
The socket(s) to bind to in daemon mode specified using one or more
tcp://host:port/path, unix:///path/to/socket, fd://* or fd://socketfd.
If the tcp port is not specified, then it will default to either 2375 when
--tls is off, or 2376 when --tls is on, or --tlsverify is specified.
docker的默认端口为2375,加密为2376
修改service文件,打开docker的2375端口
[root@kv1 systemd]#cat /lib/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
另外一台主机测试本机是否能远程连接
[root@kv2 ~]#apt update;apt install docker.io
[root@kv2 ~]#docker -H tcp://10.0.0.100:2375 info
Client:
Version: 24.0.5
Context: default
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
3.授权docker组
[root@kv2 ~]#ll /var/run/docker.sock
srw-rw---- 1 root docker 0 4月 10 22:03 /var/run/docker.sock=
普通用户无法执行docker命令,只有root有权限,或者用户是属于docker用户组的才行
[root@kv1 docker]#usermod -aG docker wang
或者直接走端口+ip,但是容易有风险,可以添加iptables规则来规风险
4.对根目录进行限制
json格式里面不能有注释,真正使用的时候需要把注释删除
建议docker目录专门放置,磁盘建议使用逻辑卷。扩容比较方便
限制日志大小。防止日志越来越大,占据磁盘空间
[root@kv1 ~]#cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://inwpakr3.mirror.aliyuncs.com"],
"graph": "/data/docker", #指定docker数据目录,新版24.0.0不支持,实现:在service文件中添加 ExecStart=/usr/bin/dockerd --data-root=/data/docker
"log-opts": {
"max-size": "300m", #指定容器日志文件的最大值
"max-file": "2" #指定容器日志文件的个数,循环写入日志文件,即一个日志满,会写入第二个文件
},
"live-restore": true, #docker.service重启,不影响容器的运行
}
[root@kv1 systemd]#systemctl daemon-reload
[root@kv1 systemd]#systemctl restart docker
镜像命令
镜像本身是没有内核的,镜像启动成为容器以后直接使用宿主机的内核,boot是共用的,其他的文件都是独立的
alpine
alpine操作系统是一个轻型linux发行版,可以直接通过apk命令直接查询和安装各种软件,相比较其他软件,容量非常小。
Alpine 官网: https://www.alpinelinux.org/
Alpine 官方仓库: https://github.com/alpinelinux
Alpine 官方镜像: https://hub.docker.com/_/alpine/
Alpine 官方镜像仓库: https://github.com/gliderlabs/docker-alpine
Alpine 阿里云的镜像仓库: https://mirrors.aliyun.com/alpine/
alpine管理软件
[root@kv1 docker]#docker pull alpine:3.19.1
[root@kv1 docker]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.19.1 05455a08881e 2 months ago 7.38MB
[root@kv1 docker]#docker run -it alpine:3.19.1 sh
基础操作
1.下载
docker pull [OPTIONS] NAME[:TAG|@DIGEST] 默认下载最新版
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像
镜像保存路径:/var/lib/docker/overlay2/镜像ID
镜像下载后会被解压缩
2.搜索
http://hub.docker.com
http://dockerhub.com
https://hub-stage.docker.com/
docker search [OPTIONS] TERM
搜索点赞100个以上的镜像
#旧语法
[root@ubuntu1804 ~]#docker search -s 100 centos
#新语法
[root@ubuntu1804 ~]#docker search --filter=stars=100 centos
3.查看本地镜像
docker images
#常用选项:
-q, --quiet Only show numeric IDs
-a, --all Show all images (default hides intermediate images)
--digests Show digests
--no-trunc Don't truncate output
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
REPOSITORY #镜像所属的仓库名称
TAG #镜像版本号(标识符),默认为latest
IMAGE ID #镜像唯一ID标识,如果ID相同,说明是同一个镜像有多个名称
CREATED #镜像在仓库中被创建时间
VIRTUAL SIZE #镜像的大小
docker images --format命令用于输出格式,每个格式字符串有多个占位符组成。每个占位符代表特殊属性
#常用的格式占位符:
{{.Repository}}:映像的仓库名称。
{{.Tag}}:映像的标签。
{{.ID}}:映像的ID。
{{.Digest}}:映像的摘要值。
{{.CreatedAt}}:映像的创建时间。
{{.Size}}:映像的大小。
[root@kv1 docker]#docker image ls --format "{{.Repository}}:{{.Tag}}"
查看指定镜像的详细信息
[root@ubuntu2204 ~]#docker inspect alpine:3.16.2
4.镜像导出
docker save [OPTIONS] IMAGE [IMAGE...]
选项:
-o, --output string Write to a file, instead of STDOUT
#说明:
Docker save 使用IMAGE ID导出,在导入后的镜像没有REPOSITORY和TAG,显示为<none>
常见用法
#导出为tar格式
docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar
#导出为压缩格式
docker save IMAGE1 IMAGE2 ... | gzip > /path/file.tar.gz
5.镜像导入
利用docker load命令可以将镜像导出的打包或压缩文件再导入
注意:镜像导入只能支持单个镜像导入,不支持多个镜像导入
docker load [OPTIONS]
#选项
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
常见用法
docker load -i /path/file.tar
docker load < /path/file.tar.gz
6.删除镜像
docker rmi
旧版本强制删除正在使用的镜像,也会删除对应的容器,新版本不允许删除正在运行的容器对应的镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents
7.清理dangling状态的镜像
dangling images表示TAG为空的镜像
[root@ubuntu1804 ~]#docker image prune -a -f
8.镜像打标签
docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
#TARGET_IMAGE[:TAG]格式一般形式
仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本
docker tag alpine:3.19.1 alpine:3.0
9.科学上网拉取镜像
可以使用此网站做代理,实现拉去原本从国内无法直接访问的镜像
https://dockerproxy.com/
无法下载指定镜像。用上面网站生成代理拉取镜像命令,拉去成功以后,在重新打赏原来的标签,删除代理的标签,只留下原有的变迁