docker中的容器:
- lxc --> libcontainer --> runC
Open Container-initiative
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- contains two specifications
- the Runtime Specification(runtime-spec)
- the Image Specification(image-spec)
-
打开容器格式
runC是一个CLI工具,用于根据OCI规范生成和运行容器
—容器作为runC的子进程启动,可以嵌入到其他各种系统中,而无需运行守护进程
- runC构建在libcontainer之上,同样的容器技术支持数以百万计的Docker Engine安装
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
docker架构 docker镜像与镜像仓库为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
docker对象 当你使用docker时,你是在创建和使用镜像、容器、网络、卷、插件和其他对象。
镜像
镜像是一个只读模板,带有创建docker容器的说明。
通常,一个镜像是基于另一个镜像,有一些额外的定制。
您可以创建自己的镜像,也可以只使用其他人创建的并在注册表中发布的镜像。
容器
容器是镜像的可运行实例。
可以通过docker API或CLI创建、运行、停止、移动或删除容器。
您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新的镜像。
docker安装 //先配置成国内的源 //阿里云镜像网站 :mirrors.aliyun.com//配置阿里云源 [root@localhost ~]# cd /etc/yum.repos.d/ //把国外的源删了 [root@localhost yum.repos.d]# rm -rf * //查看当前系统 [root@localhost yum.repos.d]# cat /etc/redhat-release CentOS Stream release 8 [root@localhost yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo //把和阿里云相关的删了 [root@localhost yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo //清除缓存 [root@localhost]# dnf clean all //下载新repo 到/etc/yum.repos.d/ epel(RHEL 8) 1)安装 epel 配置包 [root@localhost yum.repos.d]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm 2)将 repo 配置中的地址替换为阿里云镜像站地址 [root@localhost yum.repos.d]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel* [root@localhost yum.repos.d]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel* //清除缓存 [root@localhost yum.repos.d]# dnf clean all //建立缓存 [root@localhost ~]# dnf makecachedocker安装
//AppStream 源和epel源没有docker源
[root@localhost ~]# dnf list all|grep docker
//下载wget和vim
[root@localhost ~]# dnf -y install wget vim
//下载docker源
[root@localhost yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//建立缓存
[root@localhost ~]# dnf makecache
[root@localhost ~]# dnf list all|grep docker
docker-ce.x86_64 3:20.10.14-3.el8
省略.......
//安装docker
[root@localhost ~]# dnf -y install docker-ce
//设置开机自启,并立马启动
[root@localhost ~]# systemctl enable --now docker
//查看状态
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled;>
Active: active (running) since Sun 2022-04-24 19:28:53 CST; 27s >
Docs: https://docs.docker.com
Docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
//往里面写入这一行
[root@localhost ~]# vi /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://1izcbhll.mirror.aliyuncs.com"]
}
//加载
[root@localhost docker]# systemctl daemon-reload
//重启
[root@localhost docker]# systemctl restart docker
//列出docker信息
[root@localhost ~]# docker info
//查看docker版本号
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:47:44 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.14
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 87a90dc
Built: Thu Mar 24 01:46:10 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.5.11
GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc:
Version: 1.0.3
GitCommit: v1.0.3-0-gf46b6ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker常用操作
//查找 [root@localhost ~]# docker search seancheng1002/http NAME DESCRIPTION STARS OFFICIAL AUTOMATED seancheng1002/httpd //查找所有带有http的关键字的 [root@localhost ~]# docker search httpd //列出镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE //默认没有跟版本号拉最新版的httpd [root@localhost ~]# docker pull httpd Using default tag: latest ......省略 //列出镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest dabbfbe0c57b 4 months ago 144MB //拉httpd2.4.53版本的(指定版本号) [root@localhost ~]# docker pull httpd:2.4.53 //查看帮助手册 [root@localhost ~]# docker create --help //创建一个容器叫web [root@localhost ~]# docker create --name web -p 80:80 httpd bbfa14882be4b84c64254e1363e27e0490e2905393b07dd95e722cdd61893c0a //列出容器(ps 列出正在运行的容器) [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbfa14882be4 httpd "httpd-foreground" About a minute ago Created web //启动容器 [root@localhost ~]# docker start web web [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbfa14882be4 httpd "httpd-foreground" 2 minutes ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web //停止容器web [root@localhost ~]# docker stop web web [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES //重启容器(防火墙打开才能启动容器) [root@localhost ~]# systemctl start firewalld [root@localhost ~]# docker restart web web [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbfa14882be4 httpd "httpd-foreground" 16 minutes ago Up 8 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web //设置防火墙默认放行端口号(设置放行端口号) [root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=0.0.0.0/0 service name=http accept' --permanent success //重新加载 [root@localhost ~]# firewall-cmd --reload success //查看 [root@localhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens160 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="0.0.0.0/0" service name="http" accept //防火墙不放行规则是访问不了的 //查看日志 [root@localhost ~]# docker logs web 192.168.229.1 - - [24/Apr/2022:12:44:21 +0000] "GET / HTTP/1.1" 304 - 192.168.229.1 - - [24/Apr/2022:12:44:22 +0000] "GET / HTTP/1.1" 304 - 192.168.229.1 - - [24/Apr/2022:12:45:12 +0000] "-" 408 - //杀死一个或多个运行中的容器 [root@localhost ~]# docker kill web web [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbfa14882be4 httpd "httpd-foreground" 31 minutes ago Exited (137) 3 seconds ago web //在运行中的容器是不能删的,可以先停掉再删(如果真要在运行中删加上-f) [root@localhost ~]# docker rm -f web web [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES //在新容器中运行命令 (-it是交互模式) [root@localhost ~]# docker run -it --name test busybox /bin/sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 5cc84ad355aa: Pull complete Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678 Status: Downloaded newer image for busybox:latest / # ip a 1: lo://访问前把防火墙关了mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 12: eth0@if13: mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # //连接到运行的容器 [root@localhost ~]# docker start test test [root@localhost ~]# docker attach test //这种方式进来退出就停掉容器 / # exit //在运行的容器中运行命令(就算退出也在运行) [root@localhost ~]# docker start test test [root@localhost ~]# docker exec -it test /bin/sh / # exit [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6aa2c2b87349 busybox "/bin/sh" 10 minutes ago Up 34 seconds test
//关闭防火墙,并开机不自启 [root@localhost ~]# systemctl disable --now firewalld [root@localhost ~]# vi /etc/selinux/config SELINUX=disabled //把这个改为disabled [root@localhost ~]# setenforce 0ip访问



