docker基础用法与常用操作

docker基础用法与常用操作


docker是管理容器的一种程序

1. OCI&OCF

OCI

Open Container-initiative 开发的容器协议

  • 包含两个规范
    • 运行时规范
    • 镜像规格

OCF

Open Container Format 开发的容器格式

runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器

  • 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护程序
  • runC 建立在 libcontainer 之上,libcontainer 是支持数百万个 Docker 引擎安装的相同容器技术

2. docker架构

img

3. docker镜像与镜像仓库

Registry码头,镜像仓库。在docker中仓库的名字是以应用的名称取名的。

镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。

4. docker 对象

使用 Docker 时,您正在创建和使用映像、容器、网络、卷、插件和其他对象。

4.1 镜像

  • 映像是一个只读模板,其中包含有关创建 docker 容器的说明。
  • 通常,一个镜像基于另一个镜像,并具有一些额外的自定义。
  • 您可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。

4.2 容器

  • 容器是运行中的镜像。
  • 您可以使用 Docker API 或 CLI 创建、运行、停止、移动或删除容器。
  • 可以将容器连接到一个或多个网络,将存储附加到该网络,甚至可以根据其当前状态创建新映像。

5. 安装及使用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加速

docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。

docker的加速有多种方式:

  • docker cn
  • 中国科技大学加速器
  • 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)

这里我们使用阿里云的加速器

在这里插入图片描述

在这里插入图片描述

配置加速器:
[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镜像

6. docker常用操作

docker info //查看docker的运行环境、主要信息
 Registry Mirrors:
  https://48d04e7v.mirror.aliyuncs.com/
看到有这个说明加速器配置成功了
docker version //查看版本号
docker search //在 Docker 中心搜索映像‎

(但是我们一般还是上网站拉取镜像)

[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官方的
docker images //列出docker里有哪些镜像
docker pull //拉取镜像
[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		//这里是指定版本号拉取镜像
docker create //‎创建新的容器

容器是通过镜像创建得来的。创建好的容器默认是没有启动的

[root@localhost ~]# docker create --name web -p 80:80 httpd
-p 80:80	//将容器的80端口映射到真机的80端口
docker 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
ceb4443ff25b   httpd     "httpd-foreground"   5 minutes ago   Created             web
docker start +容器名/id //‎启动一个或多个停止的容器‎

(如果出现无法启动的情况,开启防火墙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装的阿帕奇界面是一个网页

docker stop //‎停止一个或多个正在运行的容器‎
[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
docker restart //重新启动容器‎
[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 kill //‎杀死一个或多个正在运行的容器‎

和docker stop的区别在于一个正常退出,一个强制退出

docker logs //‎获取容器的日志‎
docker rm //‎移除一个或多个容器‎
[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

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

想重新进去有两种方式(两种方法都要先启动,再进去):

一:

docker attach //‎附加到运行容器‎
//退出即停:
[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

二:

docker exec //‎在正在运行的容器中运行命令‎
[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
docker inspect //返回有关 Docker 对象的低级信息‎(就是列出容器或镜像的详细信息)

后面接容器的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
下面给大家看一个docker的状态流程图,供大家参考

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值