Docker(一)-安装、架构、业务开发常用命令、Dockerile、镜像卷、镜像仓库

基于业务开发使用Docker

  1. Docker是一个开源的容器引擎,它有助于更快地交付应用。
  2. Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。
  3. 使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。

Docker安装

  1. docker内核要求在3.1以上
    命令 : uname -r
  2. 安装
    命令: yum -y install docker-io
  3. 启动
    命令: service docker start
  4. 查看是否安装成功,查看版本
    命令: docker version
  5. 入门例子 安装nginx
    docker run -p 80:80 -d nginx

Docker架构

  • Docker daemon
    Docker守护进程、用来接收客户端的命令,拉取镜像、运行镜像为容器;
  • Client
    发送docker命令的客户端;
  • Images
    Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序
  • Container
    容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。
  • Registry
    远程镜像仓库、用来存储镜像;如果需要与他人合作、则需要将镜像放入远程镜像中心,让他人拉取; 类似远程Meven库、本地Maven库;

当client 通过pull命令去Docker daemon拉取镜像image时,首先查看images中存不存在对应的镜像, 如果服务端没有, 那么就会去Docker REgistry镜像仓库中拉取一个image镜像到本地(如果仓库中没有,那么通过命令buid创建一个镜像),然后通过run命令创建容器


先有镜像、再有容器、一个镜像可以运行为多个容器;

阿里云配置镜像加速

由于DockerHub是外国网站、很容易访问失败、可配置加速器;

  1. 我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator)
  2. 进入/etc/docker
  3. 创建或者更新daemon.json

vim daemon.json

{

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

}

  1. 重启服务

systemctl daemon-reload

systemctl restart docker

Docker常用命令

镜像常用命令

  1. 查看本地镜像

docker images

  1. 搜索镜像

docker search java

index : 仓库地址

name: 仓库名+ 名称

starts : 用户点赞数量

official: 是否为官方,ok则代表官方, 放心使用;

UTOMATED : 基于公开的dockerfile支撑的。

  1. 拉取镜像

docker pull java:8

  1. 查看本地所有镜像

docker images

  1. 删除镜像

docker rmi repository:tag

  1. 删除所有镜像

docker rmi $(docker images -q);

容器常用命令

通过docker run创建容器;

  1. 运行容器

docker run -d -p 81:80 nginx

-d选项:表示后台运行

-P选项:随机端口映射

-p选项:指定端口映射,有以下四种格式。

-- ip:hostPort:containerPort

-- ip::containerPort

-- hostPort:containerPort

-- containerPort

--net选项:指定网络模式,该选项有以下可选参数:

--net=bridge:默认选项,表示连接到默认的网桥。

--net=host:容器使用宿主机的网络。

--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。

--net=none:不配置该容器的网络,用户可自定义网络配置。

  1. 查看容器

docker ps

参数

-a 查出所有镜像、包括停止的

-f, 用于过滤条件、key-val形式查询

-n, 查出最近几个运行的容器

-l, 查出所有最新版本的容器

-q, 只显示容器ID

-s, 多显示容器大小

bash 复制代码
[root@centos-7 docker]# docker ps -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES                 SIZE
1294465aa995        nginx               "/docker-entrypoin..."   2 minutes ago       Up 2 minutes        0.0.0.0:90->80/tcp   suspicious_brattain   1.09 kB (virtual 141 MB)
b3f28f833918        nginx               "/docker-entrypoin..."   17 hours ago        Up 17 hours         0.0.0.0:91->80/tcp   loving_swanson        1.09 kB (virtual 141 MB)
[root@centos-7 docker]# docker ps -q
1294465aa995
b3f28f833918
[root@centos-7 docker]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1294465aa995        nginx               "/docker-entrypoin..."   3 minutes ago       Up 3 minutes        0.0.0.0:90->80/tcp   suspicious_brattain
[root@centos-7 docker]# docker ps -1
unknown shorthand flag: '1' in -1
See 'docker ps --help'.
[root@centos-7 docker]# docker ps -n 1
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1294465aa995        nginx               "/docker-entrypoin..."   3 minutes ago       Up 3 minutes        0.0.0.0:90->80/tcp   suspicious_brattain
[root@centos-7 docker]# docker ps -n 2
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1294465aa995        nginx               "/docker-entrypoin..."   3 minutes ago       Up 3 minutes        0.0.0.0:90->80/tcp   suspicious_brattain
b3f28f833918        nginx               "/docker-entrypoin..."   17 hours ago        Up 17 hours         0.0.0.0:91->80/tcp   loving_swanson

[root@centos-7 docker]# docker ps -f name=tomcat
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@centos-7 docker]# docker ps -f name=nginx
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@centos-7 docker]# docker ps -a 
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                     PORTS                NAMES
1294465aa995        nginx                     "/docker-entrypoin..."   6 minutes ago       Up 6 minutes               0.0.0.0:90->80/tcp   suspicious_brattain
b3f28f833918        nginx                     "/docker-entrypoin..."   17 hours ago        Up 17 hours                0.0.0.0:91->80/tcp   loving_swanson
8a20491ddf14        nginx                     "/docker-entrypoin..."   17 hours ago        Exited (0) 17 hours ago                         fervent_bhaskara
7a2f2b98ab37        registry-zqh/tiku:1.1.0   "java -jar /data/a..."   20 months ago       Exited (1) 20 months ago    
  1. 停止容器

普通停止: docker stop 容器ID

强制停止: docker kill 容器ID

  1. 启动/重启

启动: docker start 容器ID

重启: docker restart 容器ID

  1. 删除容器

删除已经停止的容器: docker rm 容器ID

删除正在运行的容器: docker rm -f 容器ID

  1. 查看容器日志

docker logs IMAGE_ID

  • 拉取hello-world镜像

  • 运行镜像

  • 查看日志;

  1. 进入容器

docker exec -it IMAGE_ID /bin/bash

  • 容器内安装vim、ping、ifconfig等指令

apt-get update

apt-get install vim #安装vim

apt-get install iputils-ping #安装ping

apt-get install net-tools #安装ifconfig

  1. 查看容器所有信息

docker inspect IMAGE_ID

Dockerfile

使用Dockerfile构建Docker镜像

Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节

先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页

  1. 创建空文件夹、在里面创建Dockerfile文件;
bash 复制代码
FROM nginx
RUN echo '<h1>This is zqh Nginx!!!</h1>' > /usr/share/nginx/html/index.html
  1. 构建镜像
bash 复制代码
docker build -t zqh:tuling .
  1. 运行镜像
bash 复制代码
docker run -d -p 101:80 nginx:zqh

Dockerfile常用指令

  • FROM
    基础镜像的来源
  • RUN
    构建镜像阶段执行命令,可以有多个RUN命令,执行结果会放入Image文件
  • ADD 源文件 目标文件
    • 将源文件复制到容器中的目标目录
    • src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包
bash 复制代码
ADD <src> <dest> 
  • COPY

    拷贝文件,和ADD命令类似,但不支持URL和压缩包

  • CMD

    • 容器启动后执行命令;
    • 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
  • EXPOSE

    声明容器在运行时对外提供的服务端口

  • WORKDIR

    指定容器工作路径

  • ENV

    指定容器环境变量

  • ENTRYPINT

    容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。

  • USER

    该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令

  • VOLUME

    指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME["/data"]。

构建微服务镜像

基于Eureka构建一个镜像、也可以自己打包一个SpringBoot应用;

  1. 创建空文件夹、在创建Dockerfile文件;
bash 复制代码
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
  1. 将jar包放入空文件夹下;

  2. 使用docker build构建镜像;

  3. 使用docker run运行容器;

镜像卷

有很多应用的数据是不可丢失的、例如Mysql、Redis;若是不设置挂载点、当容器关机后、数据就丢失了、导致生产事故; 而Docker通过设置挂载点、将容器的数据同步到宿主机的目录下、当容器重启时、可宿主机数据同步会容器中;

bash 复制代码
docker run -d -p 8761:8761 -v /log:/container-log microservice-eureka-server:0.0.1

JAVA_OPTS

Dockerfile中设置了${JAVA_OPTS}参数、即运行时、执行JAVA_OPTS参数可指定服务运行参数

bash 复制代码
# --cap-add=SYS_PTRACE 这个参数是让docker能支持在容器里能执行jdk自带类似jinfo,jmap这些命令,如果不需要在容器里执行这些命令可以不加
docker run -e JAVA_OPTS='-Xms1028M -Xmx1028M -Xmn512M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M' --cap-add=SYS_PTRACE -d -p 8761:8761 microservice-eureka-server:0.0.1

将微服务镜像发布到远程镜像仓库

我们制作好了微服务镜像,一般需要发布到镜像仓库供别人使用,我们可以选择自建镜像仓库,也可以直接使用docker官方镜像仓库,这里我们选择docker官方镜像仓库:https://hub.docker.com/

  1. 登录
    需要在docke官方镜像仓库注册一个账号, 输入用户名、密码;
bash 复制代码
[root@centos-7 myapp]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (yaoyaochengxian): 
Password: 
Login Succeeded
  1. 使用docker tag 给镜像前面加个分组名(一般就是docker hub的账户名)
bash 复制代码
docker tag microservice-eureka-server:0.0.1 yaoyaochengxian/microservice-eureka-server
  1. 使用docker push 推送到docker hub
bash 复制代码
docker push yaoyaochengxian/microservice-eureka-server

这样就推送成功了、可以去dockerhub中查看;

由于dockerhub进不去、先贴个图;

相关推荐
丁总学Java1 小时前
在 Mac(ARM 架构)上安装 JDK 8 环境
arm开发·macos·架构
kaiyuanheshang8 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
Python私教9 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
cnsxjean10 小时前
SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传
java·前端·spring boot·分布式·后端·中间件·架构
杨浦老苏10 小时前
开源无代码网络数据提取平台Maxun
低代码·docker·群晖
那年星空12 小时前
Flutter 设计模式全面解析:抽象工厂
flutter·设计模式·架构
RememberLey12 小时前
【eNSP】ISIS动态路由协议实验
网络·架构·智能路由器·ensp·动态路由协议·isis·huawei
凡人的AI工具箱14 小时前
40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)
开发语言·后端·安全·架构·golang
zwm_yy16 小时前
docker-mysql
mysql·docker·容器