什么是docker
Docker
和虚拟机并不一样,Docker
是在操作系统进程层面的隔离,而虚拟机是在物理资源层面的隔离,两者完全不同,另外,我们也可以通过下面的一个比较,了解两者的根本性差异。
Docker的版本
开始安装
我自己购买的是某云的服务器,系统是centos7 64如下,docker官方说至少3.8以上,建议3.10以上
1 2 3 [root@VM-24-13-centos ~]# uname -a Linux VM-24-13-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
更新yum包,需要时间可能会比较久,慢慢等就行了,生产环境慎重操作
1 2 3 vi /usr/bin/yum-config-manager #!/usr/bin/python2 -tt
1 2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1 sudo yum install docker-ce
1 sudo systemctl start docker
1 2 3 4 5 6 7 8 9 vi /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] }
1 2 sudo systemctl daemon-reload sudo systemctl restart docker
1 2 3 4 5 6 7 8 9 10 11 12 docker info Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://registry.docker-cn.com/ http://hub-mirror.c.163.com/ https://docker.mirrors.ustc.edu.cn/ Live Restore Enabled: false
1 2 3 4 5 6 7 8 9 10 11 [root@VM-24-13-centos ~]# docker version Client: Docker Engine - Community Version: 20.10.13 API version: 1.41 Go version: go1.16.15 Git commit: a224086 Built: Thu Mar 10 14:09:51 2022 OS/Arch: linux/amd64 Context: default Experimental: true
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine sudo rm -rf /var/lib/docke
三大组件 镜像(Image)
,容器(Container)
,仓库(Repository)
是我们常说的Docker
的三大组件,来自对此文章 的抄录
镜像 简单地理解,Docker镜像
就是一个Linux
的文件系统(Root FileSystem
),这个文件系统里面包含可以运行在Linux内核
的程序以及相应的数据。
谈到这里,我们可能需要先补充一点与Linux
操作系统相关的知识:
一般而言, Linux
分为两个部分:Linux内核(Linux Kernel)
与用户空间
,而真正的Linux操作系统
,是指Linux内核
,我们常用的Ubuntu
,Centos
等操作系统其实是不同厂商在Linux内核
基础上添加自己的软件与工具集(tools
)形成的发布版本(Linux Distribution
)。
因此,我们也可以把镜像看成是上面所说的用户空间
,当Docker
通过镜像创建一个容器时,就是将镜像定义好的用户空间
作为独立隔离的进程运行在宿主机的Linux内核
之上。
搜索镜像 1 2 3 4 [root@VM-24-13-centos ~]# docker search hello-word NAME DESCRIPTION STARS OFFICIAL AUTOMATED chenlicn163/hello-word hello-word 0 ...........
拉取镜像
拉取镜像可以使用docker image pull
,其格式如下:
1 docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
1 2 3 4 5 6 7 [root@VM-24-13-centos ~]# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest
查看镜像 docker images
和docker image ls
1 2 3 [root@VM-24-13-centos ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 5 months ago 13.3kB
导出和导入镜像
如果想与别人共享某个镜像,除了从镜像服务仓库中pull
镜像和把镜像push
到仓库上去之外,其实我们还可以将本地构建好的镜像直接导出并保存为文件发送给别人,如下:
1 docker image save -o /tmp/test_image.tar.gz hello-world:latest
1 2 [root@VM-24-13-centos ~]# ll /tmp/ | grep image -rw------- 1 root root 24064 Mar 17 15:11 test_image.tar.gz
而当你拿到别人导出的镜像文件,你可以使用docker load
命令把镜像加载到本地的Docker
镜像列表中,如下:
1 docker load < /tmp/test_image.tar.gz
删除本地镜像
1 docker rmi [option] IMAGE1,IMAGE2,...IMAGEn
可以使用镜像的长id、镜像短id、镜像摘要以及镜像名称来删除镜像,如下删除刚刚拉取的hello-word镜像
1 2 3 4 5 6 [root@VM-24-13-centos ~]# docker rmi feb5d9fea6a5 Untagged: hello-world:latest Untagged: hello-world@sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412 Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
当然我们想要清除本地全部镜像时,可以使用下面的命令,不过一般不建议使用
1 $ docker rmi $(docker images -qa)
另外,一般如果镜像已经被使用来创建容器,使用上面的命令删除会报下面的错误,告诉我们该镜像已经被使用,不允许删除。对于已经被用于创建容器的镜像,删除方法有两种,一种是先把容器删除,再删除镜像 ,另一种则只需要在删除镜像的命令中跟一个-f
参数便可,如:
构建镜像 面的例子都是直接使用官方提供的镜像,其实,除了从官方仓库或其他镜像仓库拉取别人构建好的镜像外,我们也可以构建自己的镜像,本次跳过
容器(Container)
启动容器 有两种,分别为docker run
和docker start
docker run
使用docker run命令通过镜像创建一个全新的容器
如果镜像(hello-world)本地不存在,会提前去下载,然后再次运行
运行后会退出,通过docker ps
查看不到,要加个-a
,docker ps -a
如容器是一种提供服务的守护进程,那么通常需要开放端口供外部访问,则容器会一直处于运行状态,如
1 2 docker run -p 81:80 nginx # -p 81:80 将容器内部端口80映射到端口81
1 2 $ docker run -p 80:80 --name mynginx nginx # --name 后面的myngin就是自定义的容器名字
1 2 3 4 $ docker run -it centos /bin/bash # -i 表示允许你对容器内的标准输入 (STDIN) 进行交互。 # -t 在新容器内指定一个伪终端或终端 # /bin/bash表示运行容器后要执行的命令
docker start 另外一种则是使用docker start
命令重新启动已经停止运行的容器
1 2 # container_id表示容器的id $ docker start container_id
进入容器
重启 而对于正在运行的容器,也可以通过docker restart
命令重新启动,如
1 $ docker restart container_id
查看容器
比如运行hellword
,为什么输入 docker ps
不显示出来呢?输入docker ps -a
就显示出来?这里说明一下,这个 hellword
是run
一下子它就结束程序了你还想它后台运行啥?如果你还是让它运行,那倒是也可以,写一个死循环就可以咯!
有时候,我们只想查到容器的id,可以用下面的命令:
停止容器
对于已经不需要的容器,可以使用docker stop
命令停止其运行,如:
1 $ docker stop container_id1,container_id2...
1 $ docker stop $(docker ps -qa)
删除容器
1 2 # container_id表示容器id,通过docker ps可以看到容器id $ docker rm container_id
1 2 3 # 删除所有容器 docker rm $(docker ps -a -q)
删除所有退出的容器,这样执行后,刚刚执行的helloword容器用docker ps -a
就查不到了
导出容器为镜像 1 $ docker export -o ./image.tar.gz f4f184f5ffb9
将容器导出后,我们可以另外一台有安装Docker
的电脑中将文件包导入成为镜像,如:
1 $ docker import image.tar.gz
仓库 仓库(Repository
)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry
)是两回事,像我们上面说的Docker Hub
,就是Docker
官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念。
公共仓库
在输入账号密码登录到Docker Hub
之后,便可以使用docker push
命令把镜像推送到Docker Hub
。
私有仓库
1 $ docker run -d -p 5000:5000 --restart=always --name registry registry
假设我们把一台IP为192.168.0.100
的服务器作为仓库服务,并运行上面的语句,那么我们可以下面的语句重新构建上面的镜像,如:
1 $ docker build -t "192.168.0.100/hello-go:1.0" .
1 $ docker push 192.168.0.100/hello-word:1.0
Docker的组成与架构
在安装好并启动了Docker
之后,我们可以使用在命令行中使用docker
命令操作docker,比如我们使用如下命令打印docker
的版本信息。
从上面的图中,我们看到打出了两个部分的信息:Client
和Server
这是因为Docker
跟大部分服务端软件一样(如MySQL
),都是使用C/S
的架构模型,也就是通过客户端调用服务器,只是我们现在刚好服务端和客户端都在同一台机器上而已。
因此,我们可以使用下面的图来表示Docker
的架构,DOCKER_HOST
是Docker server
,而Clinet便是我们在命令中使用docker
命令。