docker安装与使用

278 阅读5分钟

docker的安装与使用

image.png

docker中文社区

[docker中文社区,docker帮助,docker手册,docker教程,docker安装手册 - docker中文社区]()

docker是什么

docker是一个解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

image.png

为什么使用docker

image.png

image.png

image.png

image.png

image.png

image.png

image-20210513141714929

image.png

环境

1.虚拟机

centos7.7,自己安装的虚拟机非阿里云

2.查看系统版本命令

lsb_release -a

如果上面命令执行提示未找到命令就执行以下命令

yum install -y redhat-lsb

image.png

image.png

image.png

3.查看并且关闭防火墙

systemctl status firewalld

image.png

systemctl stop firewalld

image.png

安装docker

1.安装工具包

sudo yum install -y yum-utils

或者执行

yum update

耗时较长,耐心等待

image.png

2.设置远程仓库

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

image.png

3.安装docker

sudo yum install docker-ce

image.png

4.启动docker

启动

service docker start

停止

service docker stop

重启

service docker restart

查看版本

docker version/docker –v

加入开启启动

chkconfig docker on

image.png

image.png

5.效验

docker run hello-world

image.png

6.docker基本命令

查看所有正在运行的容器

docker ps

查看所有正在运行包括启动失败的容器

docker ps -a

删除容器

docker rm 容器名称/容器ID

如果容器正在运行,需要停止容器才能删除

停止容器

docker stop 容器ID

查看所有的镜像

docker images

删除镜像

docker rmi 镜像名称/IMAGE ID

强制删除镜像

docker image rm -f 镜像名称/IMAGE ID

删除所有镜像

如下图所示我pull了三个镜像

docker images

image.png

获取所有镜像的IMAGE ID

docker images -qa

image.png

删除所有镜像

docker rmi $(docker images -qa)

image.png

再查看已经没有了

docker images

image.png

删除所有容器

可先使用docker ps -qa 查询所有容器的ID,然后使用docker stop (dockerpsqa)命令关闭所有容器,再使用dockerrm(docker ps -qa)命令关闭所有容器,再使用docker rm (docker ps -qa)删除所有容器

image.png

​ 下面演示删除所有镜像,如下图所示,遇到了如下问题

image.png

可使用以下命令解决

删除容器ID docker rm 占用的容器ID(上图的d652b36931f5) 或者强制删除 docker image rm -f 镜像名称/IMAGE ID

配置阿里云加速器

1.登录阿里云开发者平台

[阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 (aliyun.com)](cr.console.aliyun.com/cn-hangzhou…)

2.首次登录设置密码

image.png

3.获取加速地址

https://********.mirror.aliyuncs.com

image.png

4.根据个人需要选择docker的os,安装要求修改docker配置文件,我这里使用centos,步骤如下

新建daemon.json文件

在/etc/docker/目录下新建文件daemon.json,编辑vim/etc/docker/daemon.json文件添加如下内容

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

image.png

保存退出,然后重启docker

systemctl daemon-reloadsystemctl restart docker

或者一次性执行下面命令

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://hmchwtyi.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

查看docker启动状态

service docker status

image.png

以后通过docker pull命令获取所需要的镜像就比直接在官网下载快多了

docker安装tomcat

1.获取tomcat镜像

搜索镜像

docker search tomcat

image.png

拉取镜像

docker pull tomcat

配置了阿里云的加速器之后速度会快很多

image.png

指定版本拉取

docker pull tomcat:8.0.53

自行官网搜索需要的版本:[Docker Hub](hub.docker.com/)(超级慢)搜索自己需…

image.png

image.png

2.查看所有镜像

docker images

image.png

image.png

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

3.运行容器

docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat

image.png

参数解释

a) -p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口

b) -v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的 test 挂载到容器的 /test

访问测试192.168.0.192:8080

image.png

4.如果有两个不同版本的tomcat,如下图所示

image.png

运行时需要指定TAG运行,最好使用别名区分,以免混淆

docker run --name mytomcat(别名) -p 8081(指定8081端口):8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat:8.0.53(指定TAG)

image.png

image.png

5.部署war包

进入容器

docker exec -it NAME/ CONTAINER ID bash

image.png

将war包上传到任意目录

我这里是:/home/liucong/tomcat

image.png

执行cp命令

然后在war包所在的目录下执行:

docker cp datamgt.war tomcat:/usr/local/tomcat/webapps

将war包移动到tomcat容器中的webapps下

image.png

进入容器查看是否存在datamgt.war

进入容器查看是否存在datamgt.war

image.png

上图所示war包会自动解压,退出容器exit,然后执行命令重启容器

docker restart tomcat

image.png

查看容器最近三十分钟日志

docker logs --since 30m tomcat

浏览器访问

http://192.168.0.192:8081/datamgt/treesoft/login

image.png

docker安装mysql

1.官网搜索想要拉取的版本

本次安装mysql5.7.28,如果不指定版本默认安装最高版本

image.png

docker pull

docker pull mysql:5.7.28

image.png

运行容器

docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootroot -d mysql:5.7.28

-p 3306:3306: 映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务

–v:将宿主机目录挂载到容器进行数据同步

MYSQL_ROOT_PASSWORD=rootroot:设置mysql服务root用户的密码

image.png

查看是否安装成功:docker ps,如下图所示启动了tomcat和mysql两个容器

image.png

进入mysql容器之后登陆mysql

sudo docker exec -it mysql /bin/bash

输入上面设置的密码

image.png

2.使用工具连接

image.png

将本地docker镜像上传至阿里云镜像仓库

1. 登录阿里云镜像仓库

[阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 (aliyun.com)

进入阿里云容器镜像服务控制台,首次进入需设置密码,如下图所示

image.png

目前控制没有任何私有镜像,如下图所示

image.png

创建一个镜像仓库,如下图所示

设置命名空间,仓库名称,私有或者是公开,如果是公开那么所有人都可以搜索到你上传的镜像

image.png

image.png

image.png

使用命令登录阿里云镜像仓库

docker login --username=fdliucong@gmail.com registry.cn-hangzhou.aliyuncs.com

密码就是上面设置的密码,如下图所示表示登录成功

image.png

2.查看需要上传的镜像

docker images

image.png

3.push我们需要上传的镜像

如下图所示,耐心等待(感觉超级慢,是镜像太大?网络不好?)

docker tag ef6a7c98d192 registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53
sudo docker push registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53

image.png

4.上传成功,如下图所示,阿里云镜像服务控制台就会存在

image.png

5.如果镜像设置了公开,就会被其他人搜索到,如果不想如此,请设置成私有

image.png

6.从另外一台服务器拉取我们刚刚上传的镜像,并启动tomcat服务

现在使用另一台服务器(192.168.0.191)安装docker,然后拉取镜像,步骤请参考上面步骤,这里不再重复贴图

首先登陆阿里云镜像服务

sudo docker login --username=fdliucong@gmail.com registry.cn-hangzhou.aliyuncs.com

然后执行拉取命令:

sudo docker pull registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53

版本号和阿里云镜像服务保持一致

image.png

查看镜像

docker images

image.png

运行这个镜像

docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d ef6a7c98d192

image.png

进入容器

docker exec -it CONTAINER ID bash

image.png

访问

http://192.168.0.191:8080/

image.png

docker容器数据卷

1.容器数据卷是什么

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷

2.有什么特点

a) 数据卷可以在容器之前共享或重用数据

b) 数据卷中的更改可以直接生效

c) 数据卷中的更改不会包含在镜像的更新中

d)数据卷的生命周期一直持续到没有容器使用它为止

3.添加数据卷的两种方式

通过命令挂载(即使容器退出后也会同步)

  • 首先通过

    docker pull centos 
    

    拉取了一个centos的镜像,下面演示通过命令挂载的方式

  • 执行命令

    docker run -d -it -v /home/mycentosdata:/mycentos centos
    

    docker run -d(后台运行,否则退出容器之后,容器就会停止) -it -v /宿主机绝对路径:/容器内目录 镜像名/镜像ID

    这个命令会在宿主机和容器内分别建立两个目录,这两个目录是对接的,里面的数据可以共享

    image.png

  • 查看是否挂载成功

    在容器里面执行ls -ll命令发现可以看到已经生成了mycentos文件夹

    image.png

    再看下宿主机的home目录,也生成了mycentosdata目录

    image.png

  • 用命令查看

    docker inspect 容器ID
    

    image.png

    此命令执行之后会返回一个json串,由于太长这里不贴了,只贴部分截图,如下图所示,表示挂载成功

    image.png

  • 下面我们在宿主机新建的mycentosdata新建一个文件a.txt,容器内的mycentos也会相应的生成,如下图所示

    docker exec -it 9f55d0ebb0e4(容器ID,非镜像ID) /bin/bash
    

    image.png

    image-20210513160431018

    就算是停止容器之后也会共享,这里就不做演示了,自行尝试

    通过Dockerfile的形式添加

    注:使用Dockerfile方式宿主机不会生成相应目录,但也会生成一个默认的文件,如下图所示

    • 为了规范我在宿主机根目录下创建docker文件夹并建立dockerfile文件,并添加以下内容

      FROM centos
      VOLUME ["/mydockerfiledata","/mydockerfiledata1"]  -- privileged=true
      CMD echo "success build"
      CMD /bin/bash
      

      image.png

      相当于执行命令: docker run -it -v /宿主机目录路径 : /生成的目录路径 镜像名称

    • 然后通过docker build执行我们写好的dockerfile文件(docker build和docker commit两个命令都可以建立docker镜像,docker commit需要在容器内进行,docker build不需要)

      docker build -f '/docker/DockerFile'(dockerfile绝对路径)-t liucong/centos(镜像别名,这里加了个命名空间以便区分) .(切记后面有个点)
      
      docker build -f  '/docker/DockerFile' -t liucong/centos .
      

      如下图所示表示编译成功

      image.png

      docker images
      

      命令查看,如下图所示已经有两个centos镜像

      image.png

    • 运行liucong/centos镜像:通过命令将/home/mycentosdata目录挂载到新生成的两个目录

      docker run -d -it -v /home/mycentosdata:/mydockerfiledata liucong/centos
      

      image.png

      image.png

      使用Dockerfile方式挂载在宿主机上生成默认的文件夹,如下图所示

      使用

      docker inspect 978edcf8f273(容器ID) 
      

      查看挂载信息

      下图会显示所有挂载的文件夹 宿主机和容器对应的挂载目录,上个步骤我不是手动将宿主机/home/mycentosdata挂载到容器里面的/mydockerfiledata目录嘛,所以下图第一个显示的对应关系就是如此,但是我们使用Dockerfile建立的mydockerfiledata1目录并没有使用命令指定挂载目录,所以就默认分配了一个目录

      image.png

4.读写权限

 docker run -d -it -v /home/centosdata:/centosdata:ro centos

命令中不带:ro,容器中的文件可读可写

命令中带:ro,容器中的文件只读,如下图所示

docker inspect fae237c35c06(容器ID)查看

image.png

下面演示一遍,首先在宿主机目录新建一个a.txt变写入内容,然后进入容器看是否能编辑,如下图所示

image.png

image.png

image.png

以上提示readonly,文件只读,那看来没错

docker数据卷容器

所谓数据卷容器,说白了就是活动硬盘上挂活动硬盘,实现数据上的传递依赖

  1. 下面以上一步新建的镜像liucong/centos为模板并运行容器lc01/lc02/lc03

    image.png

  2. 为了区分我将之前在宿主机和容器里面所挂载的文件都删除了,下面新建挂载目录lc01,并在挂载目录里面新建文件lc01.txt

    docker run -d -it --name lc01 -v /home/docker/lc01:/lc01 liucong/centos
    

    image.png

    下图在宿主机/home/docker/lc01目录新建了lc01.txt文件,文件内容是create lc01,下面去容器里面查看是否存在

    image.png

    如下图所示,数据已经同步到容器里面

    image.png

  3. 以上新建lc01容器,那么怎么实现数据的传递依赖呢,看下面步骤

    接下来创建lc02容器,并且继承lc01,实现数据传递,如果成功,那么我们在挂载目录新建的lc01.txt在容器lc02也会出现

    docker run -d -it --name lc02 --volumes-from lc01 liucong/centos
    

    如下图所示,lc02创建成功,下面我们进入lc02容器查看是否存lc01.txt

    image.png

    image.png

    如上图所示看来真的实现了数据传递,那么猜想如果我们在宿主机新建lc02.txt,那么容器lc01,lc02都会同步,话不多说,尝试一下

    image.png

    如上图所示,我们已经在宿主机挂载目录新建了lc02txt,并且编辑内容为create lc02,下面我们看两个容器里面是否同步

    image.png

    image.png

    如上图所示,容器lc01,lc02都存在lc02.txt,看来数据传递成功了,那么同理在新增lc03容器也是一样,这里就不贴图了

    既然新建能够进行数据传递共享,那么删除必然可以同步.如果lc01容器被删除了,那么继承lc01的容器lc02的数据是否还存在呢?

    看下图所示

    image.png

    结论是:依然存在

  4. 删除所有数据容器卷

    docker volume rm $(docker volume ls -q)
    

    删除数据卷之前要停止并删除容器,否则会提示数据卷正在被使用导致删除失败,发现一个问题,就是通过命令启动并创建数据卷的容器,容器删除之后再运行,之前创建的数据卷就没有了,而通过Dockerfile方式创建的数据卷,会一直存在