目录
一、安装
1.需要的安装包
yum install -y yum-utils
2.设置阿里云镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.更新yum软件包索引
yum makecache fast
4.安装Docker引擎
yum install docker-ce docker-ce-cli containerd.io
5.启动Docker sudo systemctl start docker
docker version 查看是否安装成功
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker version Client: Docker Engine - Community Version: 20.10.9 API version: 1.41 Go version: go1.16.8 Git commit: c2ea9bc Built: Mon Oct 4 16:08:14 2021 OS/Arch: linux/amd64 Context: default Experimental: true Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
6.运行hello-world镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# systemctl start docker [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly.
7.查看下载的hello-world镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]#docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 4 weeks ago 13.3kB
8.卸载Docker
- 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
- 删除资源
rm -rf /var/lib/docker
/var/lib/docker 是docker的默认工作路径
9.阿里云镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://w6f5mrbn.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
关于这样一个报错信息的解决
[root@iZbp12fj4dxm8z5uofcvshZ ~]# systemctl start docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
解决办法!
[root@iZbp12fj4dxm8z5uofcvshZ ~]# mv /etc/docker/daemon.json /etc/docker/daemon.conf
二、Docker的常用命令
1.帮助命令
docker info 显示Docker的系统信息,包括镜像和容器的数量
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker info Client: Context: default Debug Mode: false Plugins: app: Docker App (Docker Inc., v0.9.1-beta3) buildx: Build with BuildKit (Docker Inc., v0.6.3-docker) scan: Docker Scan (Docker Inc., v0.8.0) Server: Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 20.10.9
docker --help 帮助命令
2.镜像命令
docker images 查看所有本地的主机上的镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 4 weeks ago 13.3kB REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的大小 Options: -a, --all 列出所有镜像 --digests Show digests -f, --filter filter Filter output based on conditions provided --format string Pretty-print images using a Go template --no-trunc Don't truncate output -q, --quiet 只显示镜像的id
docker search 搜索某个镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11603 [OK] mariadb MariaDB Server is a high performing open sou… 4414 [OK]
docker pull 镜像名:[TAG] 下载镜像,TAG不写默认下载lasted
docker pull mysql:5.7 指定版本下载
docker rmi 删除镜像
docker rmi -f 镜像id 删除指定的镜像
3.容器命令(关于启动容器这里我是真的很蒙的!很多博客也没有讲清楚,因此我下定决心参考书籍自己研究)
docker run [可选参数] 镜像名/镜像id
参数说明:
--name="Name" # 容器名字,用来区分容器 -d # 后台运行容器,并返回容器id -it # 使用交互方式运行,当添加这两个参数时,docker为其创建了一个伪终端,这样就可以进入到容器的交互模式(也就是直接进入到容器里面) -p(小写) # 指定端口映射,主机端口 : 容器端口 -P(大写) # 随机端口映射
案例1:以交互方式启动一个centos容器(当然你得先拉取镜像)
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -it --name centos1 centos /bin/bash [root@9f3688e1173b /]# ls 查看容器内的centos bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
交互模式下我们可以使用exit命令 从centos容器退回到主机,同时centos也跟随着停止运行
[root@2dafac3b7c2d /]# exit exit [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
停止以后,我们希望重启这个centos,下面使用restart(并没有重新进入到容器里面)这个命令来重启,然后用docker ps命令查看,发现是正在运行的!
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker restart f158b967d2d0 f158b967d2d0 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f158b967d2d0 centos "/bin/bash" 3 minutes ago Up 18 seconds centos1
我们看到上面的演示中,容器确实是重启了, 但是我没有进入到容器里面,这里我们可以使用下面这个命令 docker attach 容器id 来进入(并且牢记一个前提:你所进入的容器是正在运行的)
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker attach f158b967d2d0 [root@f158b967d2d0 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # Ctrl+P+Q [root@f158b967d2d0 /]# read escape sequence [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f158b967d2d0 centos "/bin/bash" 19 minutes ago Up 7 minutes centos1
同时交互模式下,我们退出容器时可以不使用exit命令,而是使用Ctrl+P+Q来退出,以守护的方式退出容器,这样退出后容器仍然正常运行!
案例2:再演示一下以后台运行的方式启动一个centos容器,这里我们通过-d参数启动了一个centos容器,但是通过docker ps查看当前正在运行的容器时,发现什么都没有,这里我就蒙了,不是以后台运行的方式启动的吗,为啥什么也看不到,我被骗了吗?
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d --name centos01 centos 2d24b41c1baf7242a0759fb697ad9480cb572b3db66a1a37ebb29af778f1673d [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
同时我又做了另外一个实例演示,以后台运行的方式启动redis,这次我又惊呆了,使用docker ps命令查看时,它竟然在运行!!什么鬼! 谁能告诉可怜的娃!centos是有啥特殊的吗?
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d --name redis01 redis Unable to find image 'redis:latest' locally latest: Pulling from library/redis eff15d958d66: Pull complete 1aca8391092b: Pull complete 06e460b3ba1b: Pull complete def49df025c0: Pull complete 646c72a19e83: Pull complete db2c789841df: Pull complete Digest: sha256:619af14d3a95c30759a1978da1b2ce375504f1af70ff9eea2a8e35febc45d747 Status: Downloaded newer image for redis:latest 34501681b66c54b40834951fb1075b99c5bc7d95c3f9e334bd3abaf3f6455b54 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34501681b66c redis "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 6379/tcp redis01
在网上查了资料后解释是这样的:docker 容器使用后台运行,就必须要有一个前台进程,否则docker发现没有应用,就会自动停止,好家伙,你听听,这是人能理解的吗?
在阅览众多博客后,我有了自己的解释:这就要提到镜像的构建Dockerfile了,Dockerfile就是用来构建docker镜像的构建文件,里面写的是命令脚本!(这里为了说明这种情况,我先提一嘴)比如下面这个文件,我们在最后写了一条指令CMD /bin/bash,它表示什么意思呢,表示你用这个构建好的镜像启动一个实例时,我要执行这条命令,那这条命令又是干嘛的?其实它相当于给你启动一个命令解释器,并且类型为bash,或者也可以这么认为,你进入容器里面怎么进行交互,是不是要在键盘上敲命令,那谁来解释这些命令,并给你答复呢?就是Dockerfile里面所写的bash类型的shell解释器!
因此,为什么tomcat、nginx、redis这类的镜像在启动一个实例时,用了-d参数,却没有自动停止,是因为启动时执行的CMD指令让它开启了一个前台进程(具体是什么前台进程,我们不需要管),而centos的镜像在启动一个实例时没有CMD指令,好家伙,也就是说啥也不干,那我可就不客气了,你既然啥也不干,我直接给你停掉!这就解释了上面出现的现象!
[root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# vim dockerfile-mycentos [root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# cat dockerfile-mycentos FROM centos MAINTAINER chen<1424861923@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash
并且我注意到,如果你加上了-d参数,后面再加命令如/bin/bash,其实这条命令是无效的,因为已经指定了是在后台运行,那么这条命令便不会再起作用!
以守护形式运行容器
Ctrl+P+Q 我们执行完需要的操作退出容器时,不要使用exit退出,可以使用Ctrl+P+Q代替,以守护的方式退出容器
查看容器
- docker ps [可选项] 列出当前正在运行的容器
-a 列出当前所有正在运行的容器+历史运行过的容器 -l 显示最近创建的容器 -q 静默模式,只显示容器id [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- docker ps -a 列出当前正在运行的容器,并且显示历史运行过的容器
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9f3688e1173b centos "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago cranky_hoover dceccbdd68ef hello-