linux安装Docker 以及 DockerDocker常用命令大全

linux安装Docker

安装方法1:脚本

下面来看看 Linux 中如何安装 Docker,这里以 CentOS7 为例。

在测试或开发环境中,Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,执行这个脚本后就会自动地将一切准备工作做好,并且把 Docker 的稳定版本安装在系统中。

curl -fsSL get.docker.com -o get-docker.sh // 下载脚本
sh get-docker.sh --mirror Aliyun // 运行脚本,自行安装

安装方法2:yum
yum install docker

查看版本:

docker --version

换镜像源:

  • 1、打开配置文件:

    sudo vim /etc/docker/daemon.json
    
  • 2、内容:

    {
          
          
     "registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
    }
    

    保存并退出。


启动Docker
systemctl start docker
设置开机自启
systemctl enable docker
重启
systemctl restart docker

Docker 镜像指令

Docker 需要频繁地操作相关的镜像,所以我们先来了解一下 Docker 中的镜像指令。

查看镜像

若想查看 Docker 中当前拥有哪些镜像,则可以使用 docker images 命令。

[root@izrcf5u3j3q8xaz ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
MySQL         5.7.32    f07dfa83b528   11 days ago     448MB
tomcat        latest    feba8d001e3f   2 weeks ago     649MB
nginx         latest    ae2feff98a0c   2 weeks ago     133MB
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

其中REPOSITORY为镜像名,TAG为版本标志,IMAGE ID为镜像 id(唯一的),CREATED为创建时间,注意这个时间并不是我们将镜像下载到 Docker 中的时间,而是镜像创建者创建的时间,SIZE为镜像大小。

该指令能够查询指定镜像名:

docker image MySQL

若如此做,则会查询出 Docker 中的所有 MySQL 镜像:

[root@izrcf5u3j3q8xaz ~]# docker images MySQL
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
MySQL        5.6       0ebb5600241d   11 days ago     302MB
MySQL        5.7.32    f07dfa83b528   11 days ago     448MB
MySQL        5.5       d404d78aa797   20 months ago   205MB

该指令还能够携带-q参数:docker images -q-q表示仅显示镜像的 id:

[root@izrcf5u3j3q8xaz ~]# docker images -q
0ebb5600241d
f07dfa83b528
feba8d001e3f
d404d78aa797
下载镜像

若是要下载镜像,则使用:

docker pull MySQL:5.7

docker pull是固定的,后面写上需要下载的镜像名及版本标志;若是不写版本标志,而是直接执行docker pull MySQL,则会下载镜像的最新版本。

一般在下载镜像前我们需要搜索一下镜像有哪些版本才能对指定版本进行下载,使用指令:

docker search MySQL

img

不过该指令只能查看 MySQL 相关的镜像信息,而不能知道有哪些版本,若想知道版本,则只能这样查询:

docker search MySQL:5.5

img

若是查询的版本不存在,则结果为空:

img

删除镜像

删除镜像使用指令:

docker image rm MySQL:5.5

若是不指定版本,则默认删除的也是最新版本。


还可以通过指定镜像 id 进行删除

docker image rm bf756fb1ae65

然而此时报错了:

[root@izrcf5u3j3q8xaz ~]# docker image rm bf756fb1ae65
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container d5b6c177c151

这是因为要删除的hello-world镜像正在运行中,所以无法删除镜像,此时需要强制执行删除

docker image rm -f bf756fb1ae65

该指令会将镜像和通过该镜像执行的容器全部删除,谨慎使用。


Docker 还提供了删除镜像的简化版本

docker rmi 镜像名:版本标志

此时我们即可借助rmi-q进行一些联合操作,比如现在想删除所有的 MySQL 镜像,那么你需要查询出 MySQL 镜像的 id,并根据这些 id 一个一个地执行docker rmi进行删除,但是现在,我们可以这样:

docker rmi -f $(docker images MySQL -q)

首先通过docker images MySQL -q查询出 MySQL 的所有镜像 id,-q表示仅查询 id,并将这些 id 作为参数传递给docker rmi -f指令,这样所有的 MySQL 镜像就都被删除了。


Docker 容器指令

掌握了镜像的相关指令之后,我们需要了解一下容器的指令,容器是基于镜像的。

运行容器

若需要通过镜像运行一个容器,则使用:

docker run tomcat:8.0-jre8

当然了,运行的前提是你拥有这个镜像,所以先下载镜像

docker pull tomcat:8.0-jre8

该方式运行的 tomcat 是不能直接被外部访问的,因为容器具有隔离性,若是想直接通过 8080 端口访问容器内部的 tomcat,则==需要对宿主机端口与容器内的端口进行映射==:

docker run -p 8080:8080 tomcat:8.0-jre8

解释一下这两个端口的作用(8080:8080),第一个 8080 为宿主机端口,第二个 8080 为容器内的端口,外部访问 8080 端口就会通过映射访问容器内的 8080 端口。

此时外部就可以访问 Tomcat 了:

img

若是这样进行映射:

docker run -p 8088:8080 tomcat:8.0-jre8

则外部需访问 8088 端口才能访问 tomcat,需要注意的是,每次运行的容器都是相互独立的,所以同时运行多个 tomcat 容器并不会产生端口的冲突。

容器还能够以后台的方式运行,这样就不会占用终端:

docker run -d -p 8080:8080 tomcat:8.0-jre8  // 多了 -d 参数

启动容器时默认会给容器一个名称,但这个名称其实是可以设置的,使用指令:

docker run -d -p 8080:8080 --name tomcat01 tomcat:8.0-jre8 // 多了 --name 参数

此时的容器名称即为 tomcat01,容器名称必须是唯一的


运行mysql
docker run --name mymysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306  mysql:5.7.27 
  • MYSQL_ROOT_PASSWORD=password:设置数据库密码。

运行redis
docker run --name myredis -p 6379:6379 -d redis redis-server --appendonly yes
  • docker run表示运行的意思

  • –name myredis 表示起个名字叫myredis

  • -p 6379:6379表示把服务器的6379映射到docker的6379端口,这样就可以通过服务器的端口访问docker的端口

  • -d 表示以后台服务形式运行redis

  • redis redis-server --appendonly yes 表示开启持久化缓存模式,可以存到硬盘


查看容器

下载完成后就可以运行了,运行后查看一下当前运行的容器:docker ps

img

其中CONTAINER_ID为容器的 id,IMAGE为镜像名,COMMAND为容器内执行的命令,CREATED为容器的创建时间,STATUS为容器的状态,PORTS为容器内服务监听的端口,NAMES为容器的名称。

再来引申一下**docker ps中的几个指令参数**:

  • -a
docker ps -a  // 将运行和非运行的容器全部列举出来
  • -q
docker ps -q  // 只查询正在运行的容器 id
[root@izrcf5u3j3q8xaz ~]# docker ps -q
f3aac8ee94a3
074bf575249b
1d557472a708
4421848ba294
  • -qa
docker ps -qa // 组合使用,则查询运行和非运行的所有容器 id。
[root@izrcf5u3j3q8xaz ~]# docker ps -aq
f3aac8ee94a3
7f7b0e80c841
074bf575249b
a1e830bddc4c
1d557472a708
4421848ba294
b0440c0a219a
c2f5d78c5d1a
5831d1bab2a6
d5b6c177c151
启动容器
docker start c2f5d78c5d1a

通过该指令能够将已经停止运行的容器运行起来,可以通过容器的 id 启动,也可以通过容器的名称启动。

重启容器
docker restart c2f5d78c5d1a

该指令能够重启指定的容器。

停止容器
docker stop c2f5d78c5d1a

该指令能够停止指定的容器。

杀死容器
docker kill c2f5d78c5d1a

该指令能够直接杀死指定的容器。

以上指令都能够通过容器的 id 和容器名称两种方式配合使用。

删除容器

当容器被停止之后,容器虽然不再运行了,但仍然是存在的,若是想删除它,则使用指令:

docker rm d5b6c177c151

需要注意的是容器的 id 无需全部写出来,只需唯一标识即可。

  • 若是想删除正在运行的容器,则需要添加-f参数强制删除:
docker rm -f d5b6c177c151
  • 若是想删除所有容器,则可以使用组合指令:
docker rm -f $(docker ps -qa)

先通过docker ps -qa查询出所有容器的 id,然后通过docker rm -f进行删除。


查看容器运行日志

当容器以后台的方式运行时,我们无法知晓容器的运行状态,若此时需要查看容器的运行日志,则使用指令:

docker logs 289cc00dc5ed
  • 这样的方式显示的日志并不是实时的,若是想实时显示,需要使用-f参数:
docker logs -f 289cc00dc5ed
  • 通过-t参数还能够显示日志的时间戳,通常与-f参数联合使用:
docker logs -ft 289cc00dc5ed

查看容器内运行了哪些进程

查看容器内运行了哪些进程,可以使用指令:

docker top 289cc00dc5ed

img


查看容器运行状态
docker stats 7009c1b30112

image-20230508000943963


与容器交互

若是想与容器进行交互,则使用指令:

docker exec -it 289cc00dc5ed bash

img

此时终端将会进入容器内部,执行的指令都将在容器中生效,在容器内只能执行一些比较简单的指令,如:ls、cd 等,若是想退出容器终端,重新回到 CentOS 中,则执行exit即可。


向tomcat中部署项目

现在我们已经能够进入容器终端执行相关操作了,那么该如何向 tomcat 容器中部署一个项目呢?

docker cp ./test.html 289cc00dc5ed:/usr/local/tomcat/webapps

通过docker cp指令能够将文件从 CentOS 复制到容器中./test.html为 CentOS 中的资源路径,289cc00dc5ed为容器 id,/usr/local/tomcat/webapps为容器的资源路径,此时test.html文件将会被复制到该路径下。

[root@izrcf5u3j3q8xaz ~]# docker exec -it 289cc00dc5ed bash
root@289cc00dc5ed:/usr/local/tomcat# cd webapps
root@289cc00dc5ed:/usr/local/tomcat/webapps# ls
test.html
root@289cc00dc5ed:/usr/local/tomcat/webapps#

若是想将容器内的文件复制到 CentOS 中,则反过来写即可:

docker cp 289cc00dc5ed:/usr/local/tomcat/webapps/test.html ./

所以现在若是想要部署项目,则先将项目上传到 CentOS,然后将项目从 CentOS 复制到容器内,此时启动容器即可。


查看容器内部细节(ip/端口等)

虽然使用 Docker 启动软件环境非常简单,但同时也面临着一个问题,我们无法知晓容器内部具体的细节,比如监听的端口、绑定的 ip 地址等等,好在这些 Docker 都帮我们想到了,只需使用指令:

docker inspect 923c969b0d91

img


Docker 数据卷

学习了容器的相关指令之后,我们来了解一下 Docker 中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于:我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中。

现在若是想将宿主机中/opt/apps目录与容器中webapps目录做一个数据卷,则应该这样编写指令:

docker run -d -p 8080:8080 --name tomcat01 -v /opt/apps:/usr/local/tomcat/webapps tomcat:8.0-jre8

然而此时访问 tomcat 会发现无法访问:

img

这就说明我们的数据卷设置成功了,Docker 会将容器内的webapps目录与/opt/apps目录进行同步,而此时/opt/apps目录是空的,导致webapps目录也会变成空目录,所以就访问不到了。

此时我们只需向/opt/apps目录下添加文件,就会使得webapps目录也会拥有相同的文件,达到文件共享,测试一下:

[root@centos-7 opt]# cd apps/
[root@centos-7 apps]# vim test.html
[root@centos-7 apps]# ls
test.html
[root@centos-7 apps]# cat test.html
<h1>This is a test html!</h1>

/opt/apps目录下创建了一个 test.html 文件,那么容器内的webapps目录是否会有该文件呢?进入容器的终端:

[root@centos-7 apps]# docker exec -it tomcat01 bash
root@115155c08687:/usr/local/tomcat# cd webapps/
root@115155c08687:/usr/local/tomcat/webapps# ls
test.html

容器内确实已经有了该文件,那接下来我们编写一个简单的 Web 应用:

public class HelloServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.getWriter().println("Hello World!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req,resp);
    }
}

这是一个非常简单的 Servlet,我们将其打包上传到/opt/apps中,那么容器内肯定就会同步到该文件,此时进行访问:

img

这种方式设置的数据卷称为自定义数据卷,因为数据卷的目录是由我们自己设置的,Docker 还为我们提供了另外一种设置数据卷的方式:

docker run -d -p 8080:8080 --name tomcat01 -v aa:/usr/local/tomcat/webapps tomcat:8.0-jre8

此时的aa并不是数据卷的目录,而是数据卷的别名,Docker 会为我们自动创建一个名为aa的数据卷,并且会将容器内webapps目录下的所有内容复制到数据卷中,该数据卷的位置在/var/lib/docker/volumes目录下:

[root@centos-7 volumes]# pwd
/var/lib/docker/volumes
[root@centos-7 volumes]# cd aa/
[root@centos-7 aa]# ls
_data
[root@centos-7 aa]# cd _data/
[root@centos-7 _data]# ls
docs  examples  host-manager  manager  ROOT

此时我们只需修改该目录的内容就能能够影响到容器。


最后再介绍几个容器和镜像相关的指令:

docker commit -m "描述信息" -a "镜像作者" tomcat01 my_tomcat:1.0

该指令能够将容器打包成一个镜像,此时查询镜像:

[root@centos-7 _data]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_tomcat           1.0                 79ab047fade5        2 seconds ago       463MB
tomcat              8                   a041be4a5ba5        2 weeks ago         533MB
MySQL               latest              db2b37ec6181        2 months ago        545MB

若是想将镜像备份出来,则可以使用指令:

docker save my_tomcat:1.0 -o my-tomcat-1.0.tar
[root@centos-7 ~]# docker save my_tomcat:1.0 -o my-tomcat-1.0.tar
[root@centos-7 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  视频  文档  音乐
get-docker.sh    my-tomcat-1.0.tar     模板  图片  下载  桌面

若是拥有.tar格式的镜像,该如何将其加载到 Docker 中呢?执行指令:

docker load -i my-tomcat-1.0.tar
root@centos-7 ~]# docker load -i my-tomcat-1.0.tar
b28ef0b6fef8: Loading layer [==================================================>]  105.5MB/105.5MB
0b703c74a09c: Loading layer [==================================================>]  23.99MB/23.99MB
......
Loaded image: my_tomcat:1.0
[root@centos-7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_tomcat           1.0                 79ab047fade5        7 minutes ago       463MB

著作权归Guide所有 原文链接:https://javaguide.cn/tools/docker/docker-in-action.html#docker-%E6%95%B0%E6%8D%AE%E5%8D%B7

猜你喜欢

转载自blog.csdn.net/longzaizai_/article/details/130592020
今日推荐