Open Container-initiative 开发的容器协议
Open Container Format 开发的容器格式
runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器
Registry码头,镜像仓库。在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
使用 Docker 时,您正在创建和使用映像、容器、网络、卷、插件和其他对象。
阿里云开源镜像站(docker-ce.repo的下载地址)
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //下载docker源
[root@localhost yum.repos.d]# ls
CentOS-Base.repo epel.repo redhat.repo
docker-ce.repo epel-testing-modular.repo
epel-modular.repo epel-testing.repo
[root@localhost yum.repos.d]# dnf makecache //建立缓存
[root@localhost yum.repos.d]# dnf list all|grep docker
[root@localhost yum.repos.d]# dnf -y install docker-ce //安装
启动服务:
[root@localhost ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl status docker //查看状态
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; en>
Active: active (running) since Sun 2022-04-24 22:07:43 CST>
[root@localhost ~]# ls /etc/docker
key.json
这里是开启服务自动生成的/etc/docker目录,配置加速器会用到该目录
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
这里我们使用阿里云的加速器
配置加速器:
[root@localhost ~]# cd /etc/docker/
[root@localhost docker]# ls
key.json
[root@localhost docker]# vi daemon.json //编辑并自动生成daemon.json文件
{
"registry-mirrors": ["https://48d04e7v.mirror.aliyuncs.com"]
}
~
[root@localhost docker]# ls
daemon.json key.json
[root@localhost docker]# systemctl daemon-reload //重新加载配置文件
[root@localhost docker]# systemctl restart docker //重启docker
//加速器配置好了
/var/lib/docker有哪些内容:
[root@localhost ~]# ls /var/lib/docker
buildkit image overlay2 runtimes tmp volumes
containers network plugins swarm trust
volumes联合挂载卷,用来做绑定关系的
containers容器
image镜像
Registry Mirrors:
https://48d04e7v.mirror.aliyuncs.com/
看到有这个说明加速器配置成功了
(但是我们一般还是上网站拉取镜像)
[root@localhost ~]# docker search seancheng1002/httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
seancheng1002/httpd 0
[root@localhost ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3979 [OK]
OFFICIAL官方的
[root@localhost ~]# docker images //列出docker里有哪些镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker pull httpd //从注册表中拉取镜像或存储库,这里没有指定拉取的版本,默认拉取docker里叫latest的那个版本
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 4 months ago 144MB
[root@localhost ~]# docker pull httpd:2.4.53 //这里是指定版本号拉取镜像
容器是通过镜像创建得来的。创建好的容器默认是没有启动的
[root@localhost ~]# docker create --name web -p 80:80 httpd
-p 80:80 //将容器的80端口映射到真机的80端口
[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
ceb4443ff25b httpd "httpd-foreground" 5 minutes ago Created web
(如果出现无法启动的情况,开启防火墙systemctl start firewalld)
[root@localhost ~]# docker start web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ceb4443ff25b httpd "httpd-foreground" 11 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
关闭防火墙
[root@localhost ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# vi /etc/selinux/config
......
SELINUX=disabled
......
[root@localhost ~]# setenforce 0
httpd部署完毕
源码装的阿帕奇界面是it works!
yum装的阿帕奇界面是一个网页
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ceb4443ff25b httpd "httpd-foreground" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp, :::80->80/tcp web
[root@localhost ~]# docker stop ceb4443ff25b
ceb4443ff25b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ceb4443ff25b httpd "httpd-foreground" 3 hours ago Exited (0) 2 seconds ago web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
出现以下这种得开启防火墙才能启动和重启容器的情况该如何处理:
[root@localhost ~]# docker start web
Error response from daemon: driver failed programming external connectivity on endpoint web (f493f5041468238b0362bc605404b38970b6a8c773903d702097309b1806035f): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))
Error: failed to start containers: web
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# docker start web
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)
......
rich rules: (富规则)
rule family="ipv4" source address="0.0.0.0/0" service name="http" accept
[root@localhost ~]# docker restart web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ceb4443ff25b httpd "httpd-foreground" 5 hours ago Up 19 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
和docker stop的区别在于一个正常退出,一个强制退出
[root@localhost ~]# docker rm -f web //删除正在运行的容器要加-f ,否则不加
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd 2.4.53 c30a46771695 6 days ago 144MB
httpd latest dabbfbe0c57b 4 months ago 144MB
//删除了容器,镜像还在
docker run -it 前台运行
docker run -d 后台运行
//执行docker run命令,相当于执行docker pull 拉镜像,docker create 创建容器,docker start 启动容器,一步到位
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker run -it --name test busybox /bin/sh
//-it指的是交互模式,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
/ # exit //退出,容器就停了
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc66cfb064b1 busybox "/bin/sh" 56 minutes ago Exited (0) 42 minutes ago test
//退出去之后如何再进去呢?下面可以看到我用相同的方法就进不去了
[root@localhost ~]# docker run -it --name test busybox /bin/sh
docker: Error response from daemon: Conflict. The container name "/test" is already in use by container "dc66cfb064b170a36540d56c8fd092d33c84bcfd16b9bdeab2b7741bec657a10". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd 2.4.53 c30a46771695 6 days ago 144MB
busybox latest beae173ccac6 3 months ago 1.24MB
httpd latest dabbfbe0c57b 4 months ago 144MB
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc66cfb064b1 busybox "/bin/sh" 58 minutes ago Up 6 seconds test
想重新进去有两种方式(两种方法都要先启动,再进去):
一:
//退出即停:
[root@localhost ~]# docker attach test
/ # exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc66cfb064b1 busybox "/bin/sh" About an hour ago Exited (0) 10 seconds ago test
二:
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc66cfb064b1 busybox "/bin/sh" About an hour ago Up 10 seconds test
[root@localhost ~]# docker exec -it test /bin/sh
/ # exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc66cfb064b1 busybox "/bin/sh" About an hour ago Up About a minute test
后面接容器的id或者容器名,也可以接镜像名查看镜像的详细信息
比如:
[root@localhost ~]# docker run -d --name web httpd
//这里-d 是后台运行。这里没做端口号映射,是用浏览器访问不到的,但是可以在本机上用curl+容器IP访问
47f7a083f554483f03bd3f0a532e9ba2eaa096aaa8f6a55ebb21a1dbea2c2315
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47f7a083f554 httpd "httpd-foreground" 9 seconds ago Up 8 seconds 80/tcp web
用docker inspect web,查看容器的IP地址:
[root@localhost ~]# docker inspect web
......
"IPAddress": "172.17.0.2",
......
[root@localhost ~]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
接镜像名查看镜像的详细信息:
[root@localhost ~]# docker inspect httpd