【docker】docker最最最最全的资料,持续更新

4 篇文章 0 订阅
1 篇文章 0 订阅

1、docker安装

yum安装并启动程序

[root@192 ~]# yum install docker  -y
[root@192 ~]# systemctl enable docker
[root@192 ~]# systemctl start docker

配置docker镜像加速

[root@192 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://qegs5iwg.mirror.aliyuncs.com"]
}
[root@192 ~]# systemctl restart docker

镜像加速获取方法:
登录阿里云——>产品——>容器服务ACK——>控制台——>容器镜像服务——>镜像中心——>镜像加速器,根据提示,完成镜像加速配置(需要登录注册)

2、docker镜像管理

在主机上查看当前镜像

[root@192 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              d70eaf7277ea        2 weeks ago         72.9 MB
docker.io/mysql     latest              db2b37ec6181        2 weeks ago         545 MB
docker.io/centos    latest              0d120b6ccaa8        2 months ago        215 MB
[root@192 ~]# docker images -q   //只查看镜像的id
d70eaf7277ea
db2b37ec6181
0d120b6ccaa8

查找想要下载的镜像,并下载

[root@192 ~]# docker search all
[root@192 ~]# docker search centos
[root@192 ~]# docker pull docker.io/centos

查看镜像详情

[root@192 ~]# docker image inspect $IMAGEID

修改镜像名字和tag,等同于 复制某个镜像,修改名字和标签
镜像的名字和标签一起用时中间加: 例如 docker.io/mysql:latest

[root@192 ~]# docker tag $imageid mycentos_nginx:7   
[root@192 ~]#docker tag $REPOSITORY:TAG centos7:ok

删除镜像

# docker rmi daocloud.io/library/mysql      //使用镜像tag删除
# docker rmi ed9c93747fe1                        //使用id删除
# docker rmi ed9c93747fe1 -f       //镜像在使用中强制删除
# docker rmi $(docker images -q)                    //删除所有镜像
# docker rmi $(docker images -f "dangling=true" -q)   //删除none镜像(产生原因可能是产出了正在运行的容器的镜像)

如果镜像正在被未运行的容器使用,则需要强制删除,但是如果正在被运行的容器使用,则强制删除也无法删除

修改镜像tag

docker tag imageId repository:newTag
docker tag repository:tag repository:newTag

docker镜像id是唯一的,可以物理性的标明一个镜像,repository:tag可以有多个,但是也不会重复,也是唯一的。

修改镜像tag后,发现一个镜像变成了 “两个”,但事实上只是,镜像id相同,只是多了一个tag标签,也就是多了一个引用。删除不需要的引用即可,删除时必须用tag删除,用镜像id删除会物理性的删除镜像,这两个引用会同时被删除掉。

这时候用tag删除

docker rmi daocloud.io/library/mysql 

而不要用id删除

docker rmi ed9c93747fe1

查看镜像制作过程,相当与dockerfile(后面说)

[root@192 ~]# docker image history library/centos
//自己做镜像,但是做完的镜像时间长了,我们往往会忘记对镜像做了什么,故可以查看镜像的制作历史。但往往我们会通过dockerfile的方式做镜像,简单便捷,相当于脚本,脚本里就能看记录,无需查看历史。

3、docker容器管理

拉起docker容器

命令动作参数1、2、3…REPOSITORYshell命令
dockerrun-itdocker.io/centoscat /etc/hosts
dockerrun-it --namemysql/bin/bash
[root@192 ~]# docker run -it  --name test docker.io/centos /bin/bash
[root@192 ~]# docker run -it -h $remote_ip/$remote_hostname docker.io/centos /bin/bash
参数详解:
-i   捕获标准输入输出,保持交互式的意思
-t   分配一个终端或控制台,每一个控制台都要伴随一个shell
-d 后台运行容器,并返回ID
-m 设定容器使用的内存
-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
-v:指定宿主机上的一个路径:容器中的路径。所有目录无需新建

/bin/bash   容器运行起来之后运行的程序,也可以是任何的命令。
--name 给运行的容器命名
--dns-search: 指定容器主机所隶属的域
--dns :指定 dns 服务器地址
--memory-swap 设定swap 
--cpuset-cpus="1,3" 限制容器使用的 vCPU 的 1 和 3 核心上
--blkio-weight 600 默认情况下,所有容器能平等地读写磁盘 , 默认为 500, 可以提高权重为 600
--device-read-bps ,限制读某个设备的 bps 。
--device-write-bps ,限制写某个设备的 bps 。
--device-read-iops ,限制读某个设备的 iops 。
--device-write-iops ,限制写某个设备的 iops
(bps 是 byte per second ,每秒读写的数据量,iops 是 io per second ,每秒 IO 的次数。)
--cidfile: 指定容器运行之后container长id的存放文件位置
--restart=always:默认情况下docker重启之后所有容器会被关闭,这个选项的意思是容器随docker engine自启动。
--rm   退出时就删除该容器。默认情况下,每个容器在退出时,他的文件系统会保存下来。这样一方面有利于调试,因为可以通过查看日志等方式来确定最终状态;另一方面,也可以保持容器所产生的数据。如果仅仅需要短暂的运行一个容器,且不需要保存容器中的数据,就可以在exit容器时自动清理掉容器及其产生的数据。

如果:已经运行的容器想要添加端口映射和挂载映射,可以修改配置文件

解决方案1
把容器保存为镜像,然后用-v参数添加新的卷。这个方式比较麻烦,建议不用
解决方案2
停止容器,直接修改容器配置文件

停止容器

docker stop 容器名称

停止docker服务

systemctl stop docker

如果不停止服务的话,修改配置文件会被docker重新覆盖,无法使文件生效,如果手足够快也可以,但是几乎是不可能的

修改配置文件
配置文件在/var/lib/docker/containers目录,要注意检查自己想修改容器的ID,与子目录的名称是匹配的,要修改两个配置文件,如下

vi /var/lib/docker/containers/容器ID/config.v2.json与hostconfig.json

要注意标题符号呀,切记切记

重启docker服务

systemctl start docker

启动容器

 docker start 容器id

退出容器

[root@432a76428d1d /]#^p^q  //退出容器继续运行
[root@432a76428d1d /]# exit   //退出后,容器停止工作

注意:新人会遇到一个问题,就是如何让容器持续运行,
首先,容器一直运行的前提是要一直有进程在运行,而你的容器在使用run -it 模式运行的然后ctrl+pq的方式退出后没有停止运行的原因是,你的-i选项是一个保持交互的进程,ctrl+pq并没有终止该进程所以你的容器一直在运行,这个问题我注意到的时候是用dockerfile定制镜像的时候,用-d启动后直接退出,我的解决方案有3个,
1,启动容器直接-itd,直接让保持交互进程后台运行docker

$docker run -it centos:7.6.1810 /bin/bash 
[root@931c78538ffd /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 15:52 pts/0    00:00:00 /bin/bash
root        16     1  0 15:52 pts/0    00:00:00 ps -ef

2,用dockerfile制作镜像CMD或者ENTRYPOINT中加一个tailf /etc/null
例如:

CMD ["/bin/bash","tail -f /dev/null"]

3,用dockerfile制作镜像CMD或者ENTRYPOINT中的命令本身就是一个持续性的命令,比如运行一个python的服务

CMD ["python3","/myblog/manage.py","runserver","0.0.0.0:8000"]

停止或启动容器

[root@192 ~]# docekr stop 容器 ID
[root@192 ~]# docekr start 容器 ID
//run是将镜像拉起成为一个容器,未run过的容器,docker ps -a 是查不到,也就无法通过docekr start 或者docker stop进行操作

注意
1、docker启动后手动进入docker拉起来的进程,会在restart重启后失效
2、docker run 的时候 指定的命令,会在restart重启后执行
3、docker在制作镜像时就有的进程会被重拉,例如dockerfile的CMD与ENTRYPOINT
查看容器的运行状态

[root@192 ~]# docker ps //运行中的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
f3d143546f7a        docker.io/centos    "/bin/bash"         5 seconds ago       Up Less than a second                       serene_sammet
432a76428d1d        docker.io/centos    "/bin/bash"         11 minutes ago      Up 11 minutes                               loving_tesla

[root@192 ~]# docker ps -a //所有拉起的容器
[root@192 ~]# docker ps -a -q  //查看所有容器id
[root@192 ~]# docker ps -qf status=running    //查看某种状态的容器id 

登录容器

[root@192 ~]# docker attach $CONTAINERID  
//回到run时的状态,真正登录到容器。执行exit会退出并停止容器。
[root@192 ~]# docker exec -it $CONTAINERID /bin/bash 
//exec调用docker命令。执行exit退出,不会停止容器,后面也可以直接加命令
[root@192 ~]# docker exec -it f3 hostname
f3d143546f7a
[root@192 ~]# docker exec f3 hostname
f3d143546f7a

删除容器

[root@192 ~]# docker rm $CONTAINERID
[root@192 ~]# docker rm -f $CONTAINERID    //强制删除运行中的容器

查看容器信息/状态

[root@192 ~]# docker info   //查看当前服务所有容器的信息
[root@192 ~]# docker stats $CONTAINERID //查看cpu、内存、磁盘IO等状态
[root@192 ~]# docker inspect $CONTAINERID  //查看容器详细配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等
[root@192 ~]# docker logs $CONTAINERID    //查看日志
[root@192 ~]# docker top $CONTAINERID    //类似top
[root@192 ~]# docker diff $CONTAINERID  //查看容器内发生变化的文件,C对应的文件内容的改变,A对应的均是文件或者目录的创建删除
[root@192 ~]# docker events //实时输出Docker服务器端的事件,包括容器的创建,启动,关闭等。

4、docker创建自定义镜像

拉起一个容器,部署想要的服务,然后再打包成镜像,做到下次开箱即用
commit:提交容器到镜像,实现容器持久化;
export:导出容器和镜像,实现容器内容持久化;
save:导出镜像文件,实现镜像内容持久化。

4.1、export,把正在运行的容器直接导出为tar包的镜像文件

[root@192 ~]# docker export -o mysql_service.tar $CONTAINERID
[root@192 ~]# docker export $CONTAINERID > 315.tar

将镜像导入至其他服务器

[root@192 ~]# docker import 315.tar
[root@192 ~]# docker import 315.tar name:7   //导入就加入名字和标签

4.2、save,直接把镜像打包出来

[root@192 ~]# docker save -o suibian.tar $REPOSITORY:$TAG

将镜像导入至其他服务器

[root@192 ~]# docker load <  suibian.tar 

4.3、commit,生成新的镜像

dockercommit[OPTIONS]CONTAINER[REPOSITORY:TAG]
docker提交,生成新版本。-m 添加注释 /-a 作者/-p,–pause=true 提交时暂停容器运行容器id/name新的镜像名称
[root@192 ~]# docker commit -m "ownerimage" -a "centos" 315ed84d3304 hello:v1     

以上三者的区别、额… 有大神会
https://zhuanlan.zhihu.com/p/152219012

4.4、dockerfile,生成新的镜像(最常用)

可以将命令行的操作放到配置文件中,使用配置文件创建镜像。

  • 准备Dockerfile文件
[root@192 ~]# mkdir /dockerfiletest      //docker build需要指定此目录名字
[root@192 ~]# cd /dockerfiletest
[root@192  dockerfiletest]# touch Dockerfile      //固定名字,加载时自动识别该名字
[root@192  dockerfiletest]# cat Dockerfile 
FROM daocloud.io/library/centos:6
MAINTAINER xingyao xingyao@localhost.localdomain
RUN touch /tmp/a.txt
RUN useradd xingyao
RUN echo 123 |passwd --stdin xingyao
##注释:
FROM 基础镜像,存在直接使用,不存在自动下载
MAINTAINER 作者 作者邮箱
RUN 对镜像做的后续改变 
RUN 继续对镜像做改变 
RUN ...
每行命令均是 INSTRUCTION statement形式,即命令+清单的模式。
命令要大写
"#"是注解
可以将多行放到一行,使用&& 连接也建议这种方式,因为docker镜像在构建的时候 是按照dockerfile命令的行数分层构建的,层数越多,资源越多

RUN,CMD,ENTRYPOINT
RUN是在构建镜像的时候执行的命令,另外两个是构建完,启动容器的时候执行的,
CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:
1、CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
如使用CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /bin/bash。
2、但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run **后面的命令当做ENTRYPOINT执行命令的参数。**

VOLUME 
1.在dockerfile中声明了VOLUME的镜像,不加-v参数运行docker的时候,容器会创建一个目录,挂载到宿主机的
/var/lib/docker/volumes/$容器id 下面(不通版本可能有所不同),实现容器和宿主机数据完全同步,并且该目录的数据会持久化到宿主机中,不会随着docker的删除而删除
2.如果在run的时候加-v $容器路径 等同于在docekrfile中声明了VOLUME
3.如果在run的时候加-v $容器路径 同时dockerfile也声明了VOLUME,docker中会产生两个映射到宿主机的目录,挂载到/var/lib/docker/volumes下面。
4.如果在run的时候加-v $宿主机路径:$容器路径,且$容器路径与VOLUME相同,则会覆盖VOLUME
5.如果在run的时候加-v $宿主机路径:$容器路径,且$容器路径与VOLUME不同,则不影响在dockerfile中的VOLUME声明的结果(即2中的磁盘映射仍然存在),但是会增加一个新的宿主机的目录和容器的目录的映射,即两个目录映射了
6.可以docker instpect $容器id 找mount关键字
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/bbb",
                "Destination": "/ccc",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "52111bd4acc9fbc817d8e566e316c3faa0c97ade0f6597ab890d57c3e9d28480",
                "Source": "/var/lib/docker/volumes/52111bd4acc9fbc817d8e566e316c3faa0c97ade0f6597ab890d57c3e9d28480/_data",
                "Destination": "/aaa",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""

更加详细的参数可以参考大牛的链接
https://www.cnblogs.com/ling-yu-amen/p/10955361.html

  • 使用Dockerfile创建镜像
[root@192  dockerfiletest]# docker build -t dockerfiletest:v1 . 
 -t:tag是标识新建的镜像名
 "."是用来指明使用的Dockerfile文件当前目录的,也可用绝对路径 
由Dockerfile文件看出整个过程共5步,执行过程的详细信息会显示在终端
[root@192  dockerfiletest]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED              SIZE
dockerfiletest                          v1                  69728f308204        About a minute ago   194 MB

5、docker容器与宿主机之间文件共享

5.1、docker与宿主机之间copy文件

容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可如下方式copy到宿主机
[root@192 ~]#  docker cp $容器:/usr/local/bin/docker-entrypoint.sh   /root

将宿主机文件重新copy回容器
[root@192 ~]# docker cp /root/docker-entrypoint.sh $容器:/usr/local/bin/  

5.2、docker容器卷

使用卷可以将宿主机的文件共享到容器中,因为是共享关系,所以宿主机目录和容器目录中的数据是同步的。但无论是新卷还是其他容器共享的卷都只能应用给新容器,也就是在创建容器时使用卷

新卷只能在容器创建过程当中挂载

[root@docker ~]# docker run -it -v /abc:/hello $容器
[root@docker ~]# touch /abc/abc.txt
[root@71fcb0382357 /]# ls /hello/
abc.txt
-v:指定宿主机上的一个路径:容器中的路径。所有目录无需新建

实际应用中可以利用多个-v选项把宿主机上的多个目录同时共享给新建容器:

# docker run -it -v /abc:/abc -v /def:/def $容器

共享其他容器的卷:
[root@docker ~]# docker attach 71
[root@71fcb0382357 /]# ls /hello/
abc.txt
[root@docker ~]# docker run -it --volumes-from $容器1 $容器2 /bin/bash
[root@9b0ca8808591 /]# ls /hello/
abc.txt

–volumes-from:表示将71fc容器中共享的目录也共享给这个新的容器,71fc容器挂载到哪里,新的容器就挂载到哪里

6、Docker-Compose

6.1、docker-compose介绍

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排

  • Docker-Compose 将所管理的容器分为三层 :
    工程( project )
    服务( service )
    容器( container )
  • Docker-Compose 运行目录下的所有文件( docker-compose.yml , extends 文件或环境变量文件等)组成一个工程。
    若无特殊指定工程名即为当前目录名。
  • 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
  • 一个服务当中可包括多个容器实例, Docker-Compose 并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
  • Docker-Compose 的工程配置文件默认为 docker-compose.yml ,可通过环境变量 COMPOSE_FILE或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
  • 使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
  • Compose 允许用户通过一个单独的 docker-compose.yml 模板文件( YAML 格式)来定义一组相关联的应用容器为一个项目( project )。
  • Docker-Compose 项目由 Python 编写,调用Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API ,就可以在其上利用 Compose 来进行编排管理。

6.2、 实现 Docker-Compose

  • 安装 python2-pip 及 docker-compose
[root@192 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@192 ~]#  yum --enablerepo=epel -y install python2-pip
[root@192 ~]# pip install docker-compose
  • 编写一个 DockerFile
[root@192 file]# cat Dockerfile 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

为什么要docker运行apache要加FOREGROUND?
因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
参考:
https://www.cnblogs.com/cag2050/p/10144504.html

[root@192 file]# cat sshd 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install openssh-server
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
  • 实现 Docker-Compose
    制定一个应用配置
[root@192 file]# cat docker-compose.yml 
version: '3'
services:
  db:
    image: mariadb
    volumes:
      - /var/lib/docker/disk01:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: centos
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: centos_db
    ports:
      - "3306:3306"
  web:
    build: .
    ports:
      - "80:80"
    volumes:
      - /var/lib/docker/disk02:/var/www/html
  ssh:
    build:
      context: .
      dockerfile: sshd
    ports:
      - "2222:22"
  • 生成容器和镜像
    关闭防火墙和selinux
[root@192 file]# docker-compose up -d
[root@192 file]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f4096c00840b        file_web            "/usr/sbin/apachec..."   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   file_web_1
[root@192 file]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
file_ssh            latest              8a6791c952d6        8 minutes ago       281 MB
file_web            latest              72bf0c7f6dbc        18 minutes ago      285 MB
  • 测试
# mysql -h 127.0.0.1 -u root -p -e "show variables like 'hostname';"
# mysql -h 127.0.0.1 -u centos -p -e "show databases;"
# echo "Hello xingyao" > /var/lib/docker/disk02/index.html
# curl localhost

6.3、 更多docker-compose操作

1) 显示应用容器的状态
# docker-compose ps
2) 显示应用容器的 log
# docker-compose logs
3) 进入应用容器
# docker exec -it root_db_1 /bin/bash
6. docekr-compose 其他操作
4) 停止应用容器
# docker-compose stop
5) 运行一个应用容器 , 如果有依赖的容器也将被
运行
# docker-compose up -d web
6) 删除应用容器
# docker-compose rm

更多docker-compose学习可以参考
https://www.cnblogs.com/minseo/p/11548177.html

7、docker网络类型

7.1、同主机通信

7.1.1、bridge模式

  • 当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair 设备, Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0 (容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。
  • bridge 模式是 docker 的默认网络模式,不写 --net 参数,就是 bridge 模式。使用 docker run -p时, docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。
# docker run -ti --net=bridge --name c7 centos /bin/bash

在这里插入图片描述

7.1.2、host模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace ,而是和宿主机共用一个 Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

# docker run -ti --net=host --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.1.3、Container 模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP ,而是和一个指定的容器共享 IP 、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

# docker run -ti --net=bridge --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.1.4、None 模式

使用 none 模式, Docker 容器拥有自己的Network Namespace ,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP 、路由等信息。需要我们自己为Docker 容器添加网卡、配置 IP 等。

# docker run -ti --net=none --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.2、跨主机通信

直接看各位大牛写的吧、、太多了。

8、docekr私有仓库

  • 环境准备
    client 192.168.135.161 #测试机
    docker 192.168.135.162 #私有库
  • 实现步骤
    拉取做私有镜像仓库的镜像:
[root@docker ~]# docker pull daocloud.io/library/registry
[root@docker ~]# docker images |grep regi
daocloud.io/library/registry   latest              b2b03e9146e1        3 months ago        33.3 MB
[root@docker ~]# docker run --restart=always -d -p 5000:5000 daocloud.io/library/registry   //端口转发:解决容器端口访问问题   135.161访问-->宿主机135.162的5000端口--->容器的5000端口
93395acb90b8636453974921c9742837946b07e02d883f7157f373bdd2078e25
[root@docker ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
93395acb90b8        daocloud.io/library/registry   "/entrypoint.sh /e..."   5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp   naughty_goldwasser

进入到私有仓库容器中去

[root@docker ~]# docker exec -it 9339 /bin/sh       //这里是sh,不是bash,无软连接
/ # netstat -lnp |grep :5000
tcp        0      0 :::5000                 :::*                    LISTEN      1/registry
/ # 

访问私有仓库

[root@docker ~]# curl -I 127.0.0.1:5000         //查看状态码为200
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Sun, 21 Oct 2018 07:36:11 GMT
Content-Type: text/plain; charset=utf-8

下载小镜像buysbox上传到私有库

[root@client ~]# docker pull busybox
[root@client ~]# docker tag busybox 192.168.135.162:5000/busybox    //宿主机ip

[root@client ~]# docker push 192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
Get https://192.168.135.162:5000/v1/_ping: http: server gave HTTP response to HTTPS client

如上显示由于客户端采用https,docker registry未采用https服务导致未上传成功"192.168.1.100:5000"请求改为http。

解决方法:

[root@client ~]# touch /etc/docker/daemon.json
[root@client ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.135.162:5000"] }

[root@client ~]# systemctl restart docker

[root@client ~]# docker push  192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
8a788232037e: Pushed 
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527

查看私有仓库里的所有镜像

[root@client-161 ~]# curl  192.168.135.162:5000/v2/_catalog
{"repositories":["busybox"]}

查看更详细的镜像信息:

[root@client-161 ~]# curl  http://192.168.135.162:5000/v2/busybox/tags/list

客户端使用私有仓库的镜像

[root@client-161 ~]# docker pull 192.168.135.162:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.135.162:5000/busybox ... 
latest: Pulling from 192.168.135.162:5000/busybox
90e01955edcd: Pull complete 
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for 192.168.135.162:5000/busybox:latest
[root@client-161 ~]# docker images |grep busy
192.168.135.162:5000/busybox   latest              59788edf1f3e        2 weeks ago         1.15 MB

9、docker磁盘管理

摘要:用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理。

如果 Docker 一不小心把磁盘空间全占满了,你的服务也就算玩完了,因此所有 Docker 用户都需要对此保持警惕。当然,大家也不要紧张,这个问题还是挺好解决的。

docker system 命令

在谁用光了磁盘?Docker System 命令详解中,我们详细介绍了docker system命令,它可以用于管理磁盘空间。

docker system df命令,类似于 Linux 上的df命令,用于查看 Docker 的磁盘使用情况:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              147                 36                  7.204GB             3.887GB (53%)
Containers          37                  10                  104.8MB             102.6MB (97%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

可知,Docker 镜像占用了7.2GB磁盘,Docker 容器占用了104.8MB磁盘,Docker 数据卷占用了1.4GB磁盘。

  • docker system prune命令

可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及 dangling 镜像(即无 tag 的镜像)。

  • docker system prune -a命令

清理得更加彻底,可以将没有容器使用 Docker 镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的 Docker 镜像都删掉了…所以使用之前一定要想清楚吶。

手动清理 Docker 镜像/容器/数据卷

对于旧版的 Docker(版本 1.13 之前),是没有 docker system 命令的,因此需要进行手动清理。这里给出几个常用的命

  • 删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
  • 删除所有 dangling 镜像(即无 tag 的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
  • 删除所有 dangling 数据卷(即无用的 volume):
docker volume rm $(docker volume ls -qf dangling=true)

限制容器的日志大小

使用truncate命令,可以将 nginx 容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制 nginx 容器的日志文件大小。这个可以通过配置日志的max-size来实现,

下面是 nginx 容器的 docker-compose 配置文件:

nginx:
    image: nginx:1.12.1
    restart: always
    logging:
        driver: "json-file"
        options:
            max-size: "5g"

重启 nginx 容器之后,其日志文件的大小就被限制在5GB,再也不用担心了~

重启 Docker

操作系统内核 3.13 与docker可以有相关的 BUG,导致 Docker 无法清理一些无用目录

uname -r
3.13.0-86-generic

如果你的内核版本也是 3.13,而且清理磁盘没能成功,不妨重启一下 Docker。当然,这个晚上操作比较靠谱。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxllstar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值