初识Docker
一、概述
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。
总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
二、docker三要素
1、仓库
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库
2、镜像
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
3、容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
三、安装docker
下载关于docker的依赖环境
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
设置下载docker的镜像源,这里使用阿里云的镜像源,也可以使用官方源,但是官方源太慢了
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
安装docker
yum makecache fast 将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum -y install docker-ce
docker-ce是docker团队认证、docker团队维护的一个社区版发行包,两者使用相同的包管理,docker-ce是所有 依赖包由docker团队管理,可以保证docker运行的稳定,适合作为纯docker管理的生产环境,即整个系统只有一个docker在跑,剩下所有应用都通过发布docker的容器来部署。docker企业版是docker-ee
[root@docker ~]# yum makecache fast
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/2): docker-ce-stable/x86_64/primary_db | 46 kB 00:00:00
(2/2): docker-ce-stable/x86_64/updateinfo | 55 B 00:00:00
元数据缓存已建立
[root@docker ~]# yum -y install docker-ce
启动docker,设置为开机自启
service docker start和systemctl start docker.service都可以
[root@docker ~]# service docker start
Redirecting to /bin/systemctl start docker.service
[root@docker ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
验证安装
docker version/docker --version 查看版本信息,version更加详细(官方软件源默认启用了最新的软件)
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:21 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@docker ~]# docker --version
Docker version 19.03.13, build 4484c46d9d
docker --help 查看帮助,支持哪些管理和操作命令
[root@docker docker]# docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
…………省略部分内容
四、镜像加速
首先登陆阿里云官网:https://www.aliyun.com/?utm_content=se_1000301881‘
搜索“镜像加速”
点击进入容器控制台
左侧选择“镜像加速器”
[root@docker ~]# cd /etc/docker/
[root@docker docker]# ls
key.json
[root@docker docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://noj876oc.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://noj876oc.mirror.aliyuncs.com"]
}
[root@docker docker]# ls
daemon.json key.json
重新加载配置,重启docker
[root@docker docker]# systemctl daemon-reload
[root@docker docker]# systemctl restart docker
五、docker的仓库
1、官方仓库
docker官方:https://hub.docker.com/(需要登陆,涵盖的镜像应该非常全,但速度比较慢)
2、国内仓库
网易云仓库:https://c.163yun.com/hub(需要登陆,但中文显示比较友好)
DaoCloud:http://hub.daocloud.io/ (不需要登陆)
六、镜像的操作
1、搜索镜像
docker search tomcat
2、拉取镜像
[root@docker ~]# docker pull tomcat
3、查看镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
- docker inspect tomcat:latest
- docker inspect f796d3d2c195
使用 inspect 命令查看镜像详细信息,包括制作者、适应架构、各层的数字摘要等,后面可以跟镜像名也可以跟ID
4、添加标签
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@docker ~]# docker tag tomcat:latest tomcat:9.20
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.20 f796d3d2c195 4 days ago 647MB
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
5、删除镜像
使用docker rmi删除镜像
[root@docker ~]# docker rmi tomcat:9.20
Untagged: tomcat:9.20
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
当给镜像打了多个标签的时候,使用ID是无法删除的
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.20 f796d3d2c195 4 days ago 647MB
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@docker ~]# docker rmi f796d3d2c195
Error response from daemon: conflict: unable to delete f796d3d2c195 (must be forced) - image is referenced in multiple repositories
报错:不能删除镜像,因为它被多个仓库引用了
可以认为当存在一个ID对应多个镜像名称的时候,它不知道该删除哪一个,所以这个时候删除操作后面要跟具体的镜像名称(带标签),当最后只存在唯一一个ID时才可以用ID去删除镜像
6、镜像的导入、导出
[root@docker ~]# docker save -o /opt/tomcat tomcat:latest
[root@docker ~]# cd /opt/
[root@docker opt]# ll
总用量 644112
-rw------- 1 root root 659568128 9月 20 11:49 tomcat
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@docker opt]#
[root@docker opt]# docker rmi f7
Untagged: tomcat:latest
Untagged: tomcat@sha256:1bab37d5d97bd8c74a474b2c1a62bbf1f1b4b62f151c8dcc472c7d577eb3479d
Deleted: sha256:f796d3d2c1954864eae249749f0a17480fb446c22053f4451e2c3514c561638b
Deleted: sha256:76dec020a539b1af61f711abf3b68cbada3a3a787413923a2ef76b47ade41337
Deleted: sha256:846b984a24b53d4a0b1bcc6f1609da9a7fa1275f1a456a385a4c9a12f32a49bd
Deleted: sha256:a6f52ba4967c48d8aba223ff71a9764d2dacd53490af3d1e73da96cc66f3e05b
Deleted: sha256:b0cb8e4a85df51db4e5fe10dfa149b2b3f1170c7a3a8d33b0c5ef6e104b9a980
Deleted: sha256:6a05ecc17b6c6bc8a97223bf4a04aa5ad34084270d86ca0605bf5a603e1656f4
Deleted: sha256:40fef2729fc360297758bf86b3011b68ca41f3880f6d6578734b0280b3d8e344
Deleted: sha256:e40886afa47f1a991f807ca03358366b86c1f65471c6c7e10187cf94eae5bcd1
Deleted: sha256:28189e70cc47eb3c32769ee0aad10e6b18a8886206db4df9ccfacb50878ca1ed
Deleted: sha256:92b912e56b356aeb8e2ab873bdf557ee80fbd3bec4482684fa0f0b0c30896acc
Deleted: sha256:4ef54afed7804a44fdeb8cf6562c2a1eb745dcaabd38b1ac60126f0966bf6aef
[root@docker opt]#
[root@docker opt]#
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@docker opt]# docker load < /opt/tomcat
4ef54afed780: Loading layer [==================================================>] 119.2MB/119.2MB
6add0d2b5482: Loading layer [==================================================>] 17.1MB/17.1MB
d37096232ed8: Loading layer [==================================================>] 17.85MB/17.85MB
17bdf5e22660: Loading layer [==================================================>] 150MB/150MB
df95ed2a791d: Loading layer [==================================================>] 11.52MB/11.52MB
4f17d163126f: Loading layer [==================================================>] 3.584kB/3.584kB
8b185d674aef: Loading layer [==================================================>] 323.2MB/323.2MB
eb6e8fe5c6dc: Loading layer [==================================================>] 2.56kB/2.56kB
1485ce09f585: Loading layer [==================================================>] 20.57MB/20.57MB
b654a29de9ee: Loading layer [==================================================>] 2.048kB/2.048kB
Loaded image: tomcat:latest
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
第二种方式导入、导出:
[root@docker opt]# docker save -o /opt/nginx 7e4d58f0e5f3 <----后面跟镜像ID
[root@docker opt]# ll
总用量 777748
-rw------- 1 root root 136841216 9月 20 12:03 nginx
-rw------- 1 root root 659568128 9月 20 11:49 tomcat
[root@docker opt]# docker load -i nginx <----后面不用加路径,-i指定要导入的文件即可
Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
[root@docker opt]#
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.20 f796d3d2c195 4 days ago 647MB
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
七、容器的操作
1、运行容器
1、第一种方式:可以直接使用docker run来运行一个容器,成功运行的状态为Up
-d:以后台守护进程的方式运行
-p:指定端口号映射,前面的为要映射的外部端口号,供访问,后面的端口号为linux中的服务端口号
-P:会随机指定一个端口号,从32768开始
–name:给容器起个名字
[root@docker opt]# docker run -d -p 8080:8080 --name tomcat f796d3d2c195
8da33772c77e8a1e2c54d1f2cc1915a3650d0e0c47c6aabaf37ff9e6378014ed
[root@docker local]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5ce5b321bb f796d3d2c195 "catalina.sh run" 2 hours ago Up 3 seconds 0.0.0.0:8080->8080/tcp tomcat
2、第二种方式:使用docker create创建容器,使用docker start启动容器
[root@docker ~]# docker create -it centos:7 /bin/bash
c34e8da5f8b6e26d6980159f2622e968a94f89c53a39e737147e50eec71d26f8
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c34e8da5f8b6 centos:7 "/bin/bash" 13 seconds ago Created tender_lewin
[root@docker ~]# docker start c3
c3
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c34e8da5f8b6 centos:7 "/bin/bash" 26 seconds ago Up 3 seconds tender_lewin
2、在容器内执行命令
使用docker exec后面跟容器ID进入容器运行命令,后面可以直接跟命令
[root@docker ~]# docker exec c34e8da5f8b6 ls
anaconda-post.log
bin
dev
etc
home
lib
……省略部分内容
[root@docker ~]#
使用-it …/bin/bash(-it …bash):加上-it 会等容器内的操作执行完毕,而/bin/bash是打开容器内的一个终端进程,又因为it的等待所以就会一直以终端连接的方式停留在容器内部,使用exit退出容器内部
[root@docker ~]# docker exec -it c34e8da5f8b6 /bin/bash
[root@c34e8da5f8b6 /]#
docker run centos:7 /bin/bash -c ls /
运行 centos:7容器并使用ls /查看根目录下面的文件
注意:这种方式不会进入容器
[root@docker ~]# docker run centos:7 /bin/bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
……省略部分内容
[root@docker ~]#
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68232fc6d0f3 centos:7 "/bin/bash -c ls /" 3 minutes ago Exited (0) 3 minutes ago dazzling_mclean
c34e8da5f8b6 centos:7 "/bin/bash" 30 minutes ago Up 29 minutes tender_lewin
3、停止容器
使用docker stop后面跟容器ID来停止某一个容器,停止的状态是Exited
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5ce5b321bb f796d3d2c195 "catalina.sh run" 7 hours ago Up 6 hours 0.0.0.0:8080->8080/tcp tomcat
[root@docker ~]# docker stop 1e <-----ID号可以简写,只要能唯一标识就可以
1e
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5ce5b321bb f796d3d2c195 "catalina.sh run" 7 hours ago Exited (143) 4 seconds ago tomcat
4、删除容器
使用docker rm来删除容器,必须是停止状态的容器才能被删除,否则会报错
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5ce5b321bb f796d3d2c195 "catalina.sh run" 7 hours ago Exited (143) About a minute ago tomcat1
[root@docker ~]# docker rm 1e
1e
注意:如果要删除某个镜像,也要先确定该镜像有没有容器正在运行,如果有需要先停止
批量删除已停止的容器
[root@docker opt]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
c0706e2f9110
68232fc6d0f3
Error response from daemon: You cannot remove a running container c34e8da5f8b6e26d6980159f2622e968a94f89c53a39e737147e50eec71d26f8. Stop the container before attempting removal or force remove
[root@docker opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c34e8da5f8b6 centos:7 "/bin/bash" 2 hours ago Up About an hour tender_lewin
5、容器的导入、导出
使用docker export导出容器到文件
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0706e2f9110 centos:7 "/bin/bash -c ls /" 35 seconds ago Exited (0) 34 seconds ago jovial_gauss
68232fc6d0f3 centos:7 "/bin/bash -c ls /" 44 minutes ago Exited (0) 44 minutes ago dazzling_mclean
c34e8da5f8b6 centos:7 "/bin/bash" About an hour ago Up About an hour tender_lewin
[root@docker ~]# docker export c34e8da5f8b6 > /opt/centos7_c
[root@docker ~]# cd /opt
[root@docker opt]# ls
cento_c nginx tomcat
使用docker import导入容器
[root@docker opt]# cat cento_c | docker import - centos:7-1
sha256:7a6937221a357f32d1765d8761a8d78d984faf698ec8219f67aaaa8f0bf012c9
[root@docker opt]#
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7-1 7a6937221a35 9 seconds ago 203MB
tomcat latest f796d3d2c195 4 days ago 647MB
nginx latest 7e4d58f0e5f3 10 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
注意:容器导入之后会产生一个新的镜像而非容器,镜像ID是一个全新的