Docker

一、Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker

面向对象

容器

对象

镜像

 

  1. Docker安装(centos7)

1、如果之前已安装旧版本,请卸载它们以及相关的依赖项。

①查询安装过的包

yum list installed | grep docker

例:docker-engine.x86_64        17.03.0.ce-1.el7.centos         @dockerrepo

 

②删除安装的软件包(一个一个的删除)

yum -y remove docker-engine.x86_64

 

③删除镜像/容器等

rm -rf /var/lib/docker

 

④查看docker相关的rpm源文件(没有就删除完成)

rpm -qa |grep docker

 

2、安装(以下命令可直接复制粘贴)

①安装依赖(必须的)

sudo yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2

 

②设置远程仓库

sudo yum-config-manager \

    --add-repo \

    https://download.docker.com/linux/centos/docker-ce.repo

 

 

③安装docker(太长了,没截图)

最新版本(直接执行命令安装)

sudo yum install docker-ce docker-ce-cli containerd.io

指定版本(稳定)

列出并排序存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序

yum list docker-ce --showduplicates | sort -r

例:

docker-ce.x86_64  3:18.09.1-3.el7           docker-ce-stable

docker-ce.x86_64  3:18.09.0-3.el7           docker-ce-stable

docker-ce.x86_64  18.06.1.ce-3.el7          docker-ce-stable

docker-ce.x86_64  18.06.0.ce-3.el7          docker-ce-stable

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。服务器上我装的是18.09.0版本。

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

④启动docker

sudo systemctl start docker

⑤通过运行 hello-world 映像来验证是否正确安装

sudo docker run hello-world

 

docker一些常用命令

启动:systemctl start docker

停止:systemctl stop docker

重启:systemctl restart docker;systemctl daemon-reload

查看状态:systemctl status docker

查看版本:docker version

开机启动:systemctl enable docker

查看概要信息:docker info

查看帮助文档:docker --help

 

三、Docker镜像操作

1、列出镜像docker images

 

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小
  • 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

搜索镜像docker search 镜像名

 

  • NAME:仓库名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL:是否官方
  • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的63.4拉取镜像

 

拉取镜像docker pull 镜像名

①直接从Docker Hub拉取(很慢)

docker pull 镜像名

②镜像加速器

编辑该文件:vi /etc/docker/daemon.json // 如果该文件不存在就手动创建;说明:在centos7.x下,通过vi。

 

在该文件中输入如下内容并保存退出:

 

{

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

}

Docker官方提供的中国镜像库:https://registry.docker-cn.com

七牛云加速器:https://reg-mirror.qiniu.com

阿里镜像加速器:https://dhq9bx4f.mirror.aliyuncs.com(这个要快一点)

Ustc:https://docker.mirrors.ustc.edu.cn

这里列出四个,加速器自由选择,换着使用,这个不行就换另一个

 

注意:添加加速器后一定要重启docker服务

sudo systemctl daemon-reload

sudo systemctl restart docker

删除镜像

docker rmi $IMAGE_ID:删除指定镜像

docker rmi `docker images -q`:删除所有镜像

 

 

四、docker容器操作

1、查看容器

①查看正在运行的容器

docker ps

②查看所有容器

docker ps -a

③查看最后一次运行的容器

docker ps -l

④查看已停止的容器

docker ps -f status=exited

创建与启动容器

  • 创建容器常用的参数说明:
  • 创建容器命令:docker run
  • -i:表示以交互模式运行容器,通常与 -t 同时使用
  • -t:表示容器启动后会进入容器命令行(交互式)。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
  • --name :--name="nginx-lb": 为容器指定一个名称。
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
  • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口 。可以使用多个-p做多个端口映射

 

①交互式容器

创建一个交互式容器并取名为mycentos

docker run -it --name=mycentos centos:7 /bin/bash

 

 

通过ps命令查看,发现可以看到启动的容器,状态为启动状态

 

使用exit命令 退出当前容器

 

然后用ps -a 命令查看发现该容器也随之停止:

 

退出容器马上停止.

②守护式容器

创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复):

docker run -di --name=mycentos2 centos:7

  • 登录守护式容器方式:

docker exec -it container_name (或者 container_id) /bin/bash(exit退出时,容器不会停止)

 

停止与重启容器

  • 停止正在运行的容器:docker stop $CONTAINER_NAME/ID

 

  • 启动已运行过的容器:docker start $CONTAINER_NAME/ID

 

 

查看容器IP

通过以下命令查看容器运行的各种数据

docker inspect $CONTAINER_ID/NAME

也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID/NAME

 

5、删除容器

  • 删除指定的容器:docker rm $CONTAINER_ID/NAME

注意,只能删除停止的容器

  • 删除所有容器:docker rm `docker ps -a -q`

 

  1. docker部署springboot项目

私有仓库搭建

①下载私有仓库镜像

docker pull registry

②启动私有仓库容器(守护式容器,退出不会停止)

docker run -di --name=registry -p 5000:5000 registry

name:自己命名

测试:服务器ip:5000/v2/_catalog

 

③让docker信任私有仓库

修改vi /etc/docker/daemon.json

 

添加

"insecure-registries":["192.168.11.174:5000"]

保存退出

重启docker

拉取基础镜像

拉取官方jdk

docker pull sidereal/jre8

 

Maven构建

①修改宿主机的docker配置

根据docker版本修改宿主机配置方式不同

第一种方式

vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

修改后如刷新配置,重启服务

systemctl daemon-reload

systemctl restart docker

docker start registry

防火墙对该端口放行

firewall-cmd --permanent --zone=public --add-port=2375/tcp 

systemctl restart firewalld

 

第二种方式(我选的这种)

修改vi /etc/docker/daemon.json

{

"registry-mirrors":["https://dhq9bx4f.mirror.aliyuncs.com"],

"insecure-registries":["192.168.11.174:5000"],

"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]

}

修改后如刷新配置,重启服务

systemctl daemon-reload

systemctl restart docker

docker start registry

 

效果如下:

 

②在pom.xml中()

 

<build>

<!--打包的命名,自定义-->

<finalName>digital</finalName>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<!--这里写上main方法所在类的路径-->

<configuration>

<mainClass>com.hospital.digital.web.DigitalHospitalApplication</mainClass>

</configuration>

<executions>

<execution>

<goals>

<goal>repackage</goal>

</goals>

</execution>

</executions>

</plugin>

<!--docker的maven插件,官网: https://github.com/spotify/docker‐maven‐plugin-->

<plugin>

<groupId>com.spotify</groupId>

<artifactId>docker-maven-plugin</artifactId>

<version>0.4.13</version>

<configuration>

<imageName>服务器ip:5000/${project.artifactId}:${project.version}</imageName>

<!--根据拉取自己拉取的jdk镜像版本-->

<baseImage>sidereal/jre8</baseImage>

<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>

<resources>

<resource>

<targetPath>/</targetPath>

<directory>${project.build.directory}

</directory>

<include>${project.build.finalName}.jar</include>

</resource>

</resources>

<dockerHost>http://服务器ip:2375</dockerHost>

</configuration>

</plugin>

</plugins>

</build>

以上配置会自动生成Dockerfile

进入所在模块目录,输入以下命令,打包上传

mvn docker:build -DpushImage

查看镜像

 

浏览器访问 http://服务器ip:5000/v2/_catalog ,输出

{"repositories":["digital-hospital-web"]}

 

说明镜像以上传到私有容器

 

启动容器

docker run -d -p 28888:28888 $IMAGE ID

 

-d后台启动

-p暴露端口

通过: 服务器ip:映射端口号/....可以访问

 

 

  1. docker部署前端项目

拉取nginx镜像

docker pull nginx

 

准备文件

①前端项目打包(这里随意用一个前端项目演示,打包成dist)

②准备Dockerfile文件(不要后缀)

# 设置基础镜像

FROM nginx

# 将dist文件中的内容复制到 /usr/local/nginx/html/ 这个目录下面

COPY dist/ /usr/local/nginx/html/

# 将该目录的下的nginx.conf文件复制到/etc/nginx/下

COPY nginx.conf /etc/nginx/nginx.conf

RUN echo 'echo init ok!!'

 

③nginx.conf文件

 

server {

listen 29999;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location /{

root /usr/local/nginx/html;

index index.html index.htm;

}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#

#location ~ \.php$ {

# proxy_pass http://127.0.0.1;

#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#

#location ~ \.php$ {

# root html;

# fastcgi_pass 127.0.0.1:9000;

# fastcgi_index index.php;

# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

# include fastcgi_params;

#}

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#

#location ~ /\.ht {

# deny all;

#}

}

 

④存放

将前端打包项目、dockerfile、nginx.conf文件传到服务器,存放在同一个文件夹下(任意目录)

这里我存放在root下自建的jdkdockerfile目录下

 

⑤运行

进入jdkdockerfile

cd jdkdockerfile/

 

 

打包生成镜像

docker build -t longdb .

注意:

-t 后镜像名,自定义,最后一定要加“.”表示执行该目录下的dockerfile

 

 

 

查看生成的镜像

 

创建容器运行

docker run -d --name long -p 29999:29999 9e8a428aa034

-d后台运行

--name自定义

-p暴露端口

最后接镜像ID

 

运行结果:浏览器输入服务器ip:端口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这个问题没有解决,我是直接卸载docker,重装

 

Logo

前往低代码交流专区

更多推荐