走进docker的世界之容器进阶

本文深入探讨Docker容器的高级用法,包括如何进入容器内部执行命令、容器数据持久化、主机与容器间的数据拷贝、日志查看、镜像仓库创建,以及通过1号进程理解容器的本质。详细介绍了普通及带认证的Registry,以及Docker企业级镜像仓库Harbor。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器的进阶

进入容器或者执行容器内

 $ docker exec -ti <container_id_or_name> /bin/sh
 $ docker exec <container_id_or_name> hostname

容器数据持久化

 ## 挂载主机目录
 $ docker run --name nginx -d  -v /opt:/opt -v /var/log:/var/log nginx:alpine
 $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7
 
 ## 使用volumes卷
 $ docker volume ls
 $ docker volume create my-vol
 $ docker run --name nginx -d -v my-vol:/opt/my-vol nginx:alpine
 $ docker exec -ti nginx touch /opt/my-vol/a.txt
 
 ## 验证数据共享
 $ docker run --name nginx2 -d -v my-vol:/opt/hh nginx:alpine
 $ docker exec -ti nginx2 ls /opt/hh/
 a.txt

主机与容器之间拷贝数据

 ## 主机拷贝到容器
 $ echo '123'>/tmp/test.txt
 $ docker cp /tmp/test.txt nginx:/tmp
 $ docker exec -ti nginx cat /tmp/test.txt
 123
 
 ## 容器拷贝到主机
 $ docker cp nginx:/tmp/test.txt ./

查看容器日志

 ## 查看全部日志
 $ docker logs nginx
 
 ## 实时查看最新日志
 $ docker logs -f nginx
 
 ## 从最新的100条开始查看
 $ docker logs --tail=100 -f nginx

查看容器或者镜像的明细

 ## 查看容器详细信息,包括容器IP地址等
 $ docker inspect nginx
 
 ## 查看镜像的明细信息
 $ docker inspect nginx:alpine

创建镜像仓库容器

参考文档
https://docs.docker.com/registry/

普通的registry
## 使用docker镜像启动镜像仓库服务
$ docker run -d -p 5000:5000 --restart always --name registry registry:2

## 默认仓库不带认证,若需要认证,参考https://docs.docker.com/registry/deploying/#restricting-access

$ docker tag nginx:alpine localhost:5000/nginx:alpine
$ docker push localhost:5000/nginx:alpine

## 镜像仓库给外部访问,不能通过localhost,尝试使用内网地址192.168.136.10:5000/nginx:alpine
$ docker tag nginx:alpine 192.168.136.10:5000/nginx:alpine
$ docker push 192.168.136.10:5000/nginx:alpine
The push refers to repository [192.168.136.10:5000/nginx]
Get https://192.168.136.10:5000/v2/: http: server gave HTTP response to HTTPS client
## docker默认不允许向http的仓库地址推送,如何做成https的,参考:https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry
## 我们没有可信证书机构颁发的证书和域名,自签名证书需要在每个节点中拷贝证书文件,比较麻烦,因此我们通过配置daemon的方式,来跳过证书的验证:
$ cat /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://8xpk5wnt.mirror.aliyuncs.com"
  ],
  "insecure-registries": [
     "10.0.0.21:5000"
  ]
}
$ systemctl restart docker

# 推送
docker push 10.0.0.21:5000/nginx
 ## 解压离线镜像文件
 $ tar zxf registry.tar.gz -C /opt
 
 ## 删除当前镜像仓库容器
 $ docker rm -f registry
 ## 使用docker镜像启动镜像仓库服务
 $ docker run -d -p 5000:5000 --restart always -v /opt/registry:/var/lib/registry --name registry registry:2

实现步骤

  1. 打标签
  2. docker pull
带basic认证的registry
yum install httpd-tools -y 
mkdir /opt/registry-var/auth/ -p 
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd 
docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry

####效果
[root@xiang ~]# docker push 10.0.0.101:5000/mysql:5.7
The push refers to repository [10.0.0.101:5000/mysql]
50644c29ef5a: Preparing 
no basic auth credentials
[root@xiang ~]# docker pull 10.0.0.101:5000/mysql:5.7
Error response from daemon: Get http://10.0.0.101:5000/v2/mysql/manifests/5.7: no basic auth credentials
[root@xiang ~]# 

# 测试
[root@xiang ~]# docker login 10.0.0.101:5000
Username: oldboy
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@xiang ~]# docker pull 10.0.0.101:5000/mysql:5.7
5.7: Pulling from mysql
Digest: sha256:a15790640a6690aa1730c38cf0a440e2aa44aaca9b0e8931a9f2b0d7cc90fd65
Status: Image is up to date for 10.0.0.101:5000/mysql:5.7
10.0.0.101:5000/mysql:5.7
[root@xiang ~]# docker push 10.0.0.101:5000/mysql:5.7
The push refers to repository [10.0.0.101:5000/mysql]
50644c29ef5a: Layer already exists 
5.7: digest: sha256:a15790640a6690aa1730c38cf0a440e2aa44aaca9b0e8931a9f2b0d7cc90fd65 size: 528
docker企业级镜像仓库harbor(vmware 中国团队)

通过1号进程理解容器的本质

$ docker exec -ti my-nginx-alpine /bin/sh
#/ ps aux

容器启动的时候可以通过命令去覆盖默认的CMD

$ docker run -d --name xxx nginx:alpine <自定义命令>
# <自定义命令>会覆盖镜像中指定的CMD指令,作为容器的1号进程启动。

$ docker run -d --name test-3 nginx:alpine echo 123

$ docker run -d --name test-4 nginx:alpine ping www.luffycity.com

本质上讲容器是利用namespace和cgroup等技术在宿主机中创建的独立的虚拟空间,这个空间内的网络、进程、挂载等资源都是隔离的。

$ docker exec -ti my-nginx /bin/sh
#/ ip addr
#/ ls -l /
#/ apt install xxx
#/ #安装的软件对宿主机和其他容器没有任何影响,和虚拟机不同的是,容器间共享一个内核,所以容器内没法升级内核
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值