Bootstrap

Docker镜像基础详解

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/

无法下载指定镜像。用上面网站生成代理拉取镜像命令,拉去成功以后,在重新打赏原来的标签,删除代理的标签,只留下原有的变迁

;