小工具      在线工具  汉语词典  css  js  c++  java

docker使用集锦

# docker,docker,容器,运维 额外说明

收录于:152天前

docker简介

Docker 是一种软件,可以在安装了 Docker 软件的任何系统上虚拟化容器。用户可以在容器上构建任意定制的环境。

容器和虚拟机的区别在于,虚拟机需要对硬件进行虚拟化,并为虚拟机分配一定的资源,包括网卡、内存、磁盘等。但容器只是虚拟服务,基于操作系统虚拟化,所以容器更加轻量。

Docker平台是一个软件容器化平台。用户可以构建应用程序并将其依赖项打包到容器中。由于环境匹配,所以可以很容易地移植到其他安装了Docker软件的系统上。

容器构建的一整套的环境称为镜像,镜像是面向操作系统的,因此操作系统上可以干的事情,在容器中都可以干。

例如,您可以在容器中构建完整的Ubuntu环境。您可以使用ubuntu作为基础操作系统,然后构建其他服务。对于初学者来说,可以这样做。使用docker构建ubuntu比使用虚拟机安装ubuntu系统更节省资源。大多数情况下,docker用于DevOps,一般构建数据库、中间件、Web服务等。

安装docker

前面提到,docker是一个容器软件,也是一个跨平台软件,可以运行在任何主流操作系统上。 (这里以Ubuntu为例)

docker新手教程

apt是Ubuntu自带的一个软甲包,可以使用默认的软件包,也可以下载使用yum安装。

参考docker官网

Ubuntu20.04安装Docker

安装完成后可以通过docker -v来判断是否安装成功。

在这里插入图片描述
Docker超详细基础教程

在这里插入图片描述

docker引擎负责在主机上运行和调度docker镜像服务。注册表是存储许多图像模板的远程仓库。主机和注册表之间的关系就像实例和对象之间的关系。 docker引擎通过命令来操作宿主机docker容器的服务。

在这里插入图片描述

docker镜像加速器

# 需要在/etc/docker/daemon.json
{
    
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "insecure-registries": ["ip:port]
}
# ip:port
公司私服的ip和port
# 重启两个服务
systemctl daemon-reload
systemctl restart docker                          

启动docker服务

Docker是一个软件,其启动和运行也是基于操作系统的。

# 4.启动Docker,并设置为开机自动启动,测试
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world

Ubuntu服务命令

1、service指令:

service 服务名 [start | stop | restart | reload | status]

service docker status

2、systemctl指令:

systemctl [start | stop | restart | reload | status] 服务名

systemctl start docker

在这里插入图片描述

docker命令

  • 系统操作docker
//启动docker服务
systemctl start docker 
//关闭
systemctl stop docker 

//状态查看
systemctl status docker 

//重启
systemctl restart docker 

//开机启动
systemctl enable docker 
  • docker命令操作镜像

镜像分为本地镜像、中央仓库镜像和私有镜像。镜像是一个模板,容器需要根据模板来构建。

# 列出本地镜像
docker images

在这里插入图片描述
REPOSITORY是镜像名称,TAG是版本号 ,IMAGE_ID是镜像id。

# 删除本地一个或多个镜像
docker rmi
# 从Docker Hub查找镜像
docker search

在这里插入图片描述

# 仓库下载镜像
docker pull [name]:[tag]

在这里插入图片描述
下载镜像是下载在本地仓库,用户通过镜像构建容器,构建本地服务。

  • docker命令操作容器
# 基于镜像构建新的容器
docker run [OPTIONS] IMAGE [COMMAND] 

-i: 以交互模式运行容器
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d: 后台运行容器,并返回容器ID
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
docker kill :杀掉一个运行中的容器
docker rm :删除一个或多个容器
docker pause :暂停容器中所有的进程。

docker unpause :恢复容器中所有的进程。
docker create :创建一个新的容器但不启动它
docker attach [option] continer

在这里插入图片描述
在这里插入图片描述

使用exit命令退出容器后容器也会停止。

docker exec :在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

在这里插入图片描述
在这里插入图片描述

docker exec 不进入容器就执行容器中的命令

//docker exec命令创建临时终端
docker exec -it [容器名称] bash

在这里插入图片描述

docker ps : 列出正在运行的容器

-a :显示所有的容器,包括未运行的。
docker inspect  查看容器的详细信息

网络与服务共享

docker创建的容器是一个相对独立的空间。一般来说,如果没有特殊配置,容器的外部是无法访问容器内部的,如下图:

在这里插入图片描述
使用docker run命令运行一个终端,基于redis镜像构建的容器,因此容器默认运行一个reds服务。

在新开一个终端,使用redis-cli命令,发现无法连接终端。

在这里插入图片描述
在新开的终端使用docker exec命令进入容器后在能访问redis。

在这里插入图片描述

容器中运行的redis服务是相对于宿主机独立的服务。外部无法直接访问,只能访问宿主机。那么如何访问容器的服务呢?

在这里插入图片描述

容器的服务通过端口暴露给外部,即将容器端口映射到外部主机的端口。

docker run -p [主机端口]:[容器服务端口]

搭建mysql服务容器并实现远程访问。

//redis镜像
docker pull mysql:8.0

//创建共享文件夹(下一节)
mkdir mysql

//容器端口与主机端口映射向外暴露服务

docker run -id \
-p 3306:3306 \
--name=redis \
-v $pwd/conf:/etc/mysql/conf.d \
-v $pwd/logs:/logs \
-v $pwd/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=ROOT \
mysql:8.0

在这里插入图片描述

该命令的共享文件夹是mysql安装时的默认目录,一般不能更改。只需要映射主机上的目录和文件即可保证数据不丢失。

容器共享文件

docker容器的共享文件夹可以实现容器与宿主机之间的数据共享以及容器之间的数据共享。

docker run ... -v [宿主机器目录(文件)]:[容器目录(文件)]

防范措施:

  1. 该目录必须是绝对目录
  2. 如果该目录不存在,则会自动创建。
  3. 共享文件夹数量没有限制

docker构建常见的容器

  • 雄猫
# pull images
docker pull tomcat

#创建共享文件夹
mkdir tomcat

# 端口映射和共享文件夹设置
docker run -id --name=tomcat \
-p 8080:8080 \
-v $pwd/tomcat:/usr/local/tomcat/webapps \
tomcat

pwd是linux的显示当前目录的命令,$pwd将结果作为下一个命令的参数。

设置的共享文件夹路径是一致的,/usr/local/tomcat/webapps是tomcat默认安装时的webapps目录,该目录下的war文件自动启动为web服务。因此只需要将打包的war文件复制到主机的共享文件夹即可。

  • nginx
# 拉取镜像
docker pull nginx

# 创建容器,配置映射端口,共享文件夹
docker run -id --name=nginx \
-p 80:80 \
-v $pwd/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $pwd/nginx/logs:/var/log/nginx\
-v $pwd/html:/usr/share/nginx/html\
nginx 

在所有配置的共享文件夹的作用都在,修改主机文件夹过后容器自动同步共享文件夹,等同于直接配置容器文件夹。
具体各个服务的默认安装目录请自行查阅资料。

容器的复用dockerfile

在使用docker命令部署时,我们遇到了一个新问题,就是部署时每台机器都要重新配置环境。当然,你也可以将容器打包为镜像上传到仓库。其他人可以下载它并重新配置共享文件。但是这需要频繁的投递docker镜像的压缩包,而且压缩和解压的过程也非常复杂。不方便。 dockerfile的出现解决了这一系列问题。 dockerfile 定义了构建分层镜像的步骤。运行修改后的文件即可一键生成完整的镜像,非常方便。

构建好的容器可以重复使用。将容器打包成镜像即可重复使用。

在这里插入图片描述
在这里插入图片描述

Dockerfile同样是容器复用标准,比命令更实用。 Docker容器是通过dockerfile文件构建的,这样任何主机上搭建的容器环境都是完全一致的,不会出现版本、丢失等问题。任何人拿到dockerfile后构建的容器与第一次构建的容器是一模一样的。大大提高了容器的复用性和便携性。

Dockerfile分为四个部分:镜像基本信息、维护者信息、镜像操作指令、容器启动时的执行指令。

参考

Dockerfile 由一行命令语句组成,并支持以 # 开头的注释行。您必须首先注明其所基于的镜像的名称,然后建议注明维护者信息。后面是镜像操作指令,比如RUN指令,RUN指令会在镜像上执行以下命令。每次运行 RUN 指令时,都会向映像添加一个新层并提交。最后还有CMD指令,用于指定运行容器时的操作命令。

## 拉取镜像(确保镜像存在)
FROM <image>或FROM <image>:<tag>  # 第一条指令必须为 FROM 指令

## 定义维护者信息
MAINTAINER <name>   # 指定维护者信息。

## 基于镜像构建容器实例 相当于docker run
RUN <command> 或 RUN ["executable", "param1", "param2"] # 前者shell 终端中运行命令,后者则使用 exec 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的容器


## 容器内部执行的命令
CMD command param1 param2   #在 /bin/sh 中执行

## 主机容器映射的端口
EXPOSE <port> [<port>...] # Docker 服务端容器暴露的端口号

## 复制文件指令
COPY  <源路径> <容器目标路径>  #从上下文目录中复制文件或者目录到容器里指定路径。

## 配置环境变量
ENV <key> <value> # 指定一个环境变量

## 复制文件指令和copy类型
ADD <src> <dest>  # 复制指定的 <src> 到容器中的 <dest> //共享文件夹

## 类似cmd命令不会被命令行覆盖
ENTRYPOINT [...]

## 定义共享文件夹
VOLUME <路径>  # 将主机上的目录映射到容器中,路径为/var/lib/docker/volumes

通过docker build 命令来通过dockerfile文件构建镜像。更多资料移步Docker中文文档

docker镜像实际上是一个可重用的文件系统。当前文件系统需要什么服务,重新构建并按顺序叠加。

# 构建java运行时环境

FROM java:8
MAINTAINER xiaoxu<xiaoxu>
ADD ./springboot-version.jar app.jar
CMD java -jar app.jar

使用dockerfile构建镜像后,基于镜像构建容器并启动项目。

docker命令部署spring boot项目

目前主流的Java框架是spring,软件包是jar包。只需要搭建一个基于jar的容器环境即可。打包成jar后,只需要jvm即可运行,因此需要使用jdk作为镜像来构建容器。

  1. 根据命令搭建jdk环境

拉取openjdk镜像:docker pull openjdk:8

在这里插入图片描述

在这里插入图片描述

  • 上传Web文件,启动容器和Web服务

在这里插入图片描述

在这里插入图片描述

sudo docker run -id --name=springboot1 -p 8080:8080 -v /home/master/java:/root/www openjdk:8构建容器命令。

如上图所设计使用构建容器命令,创建了一个伪终端,终端编号是唯一的,新建一个终端使用docker ps查看容器状态。共享文件时需要绝对路径

由于构建的容器映射了共享文件夹,因此容器和主机将自动同步。

将文件移至共享文件夹

在这里插入图片描述
容器的共享文件夹自动同步了主机共享文件夹的内容,如下图:
在这里插入图片描述

启动的容器目录下存在jar文件,在容器终端使用命令行启动即可。
在这里插入图片描述
在这里插入图片描述

外部浏览器成功访问web,并且可以部署jar,至此docker容器构建成功。

在这里插入图片描述
启动成功后直接断开ssh连接即终端容器也继续在后台运行。

使用sudo docker exec -it [container_name] /bin/bash进入容器内部。/bin/bash时linux的交互式终端。一定要有-it表示创建一个伪终端。

-i表示创建交互式容器
-t表示生成一个伪终端

在这里插入图片描述

从上图可以看到,openjdk实际上是526MB。这是因为图像是一个分层系统。 openjdk底层还使用了其他镜像。软件工具包是建立在操作系统之上的,所以jdk也需要建立在操作系统之上。因此,openjdk的镜像分层如下:

在这里插入图片描述

在这里插入图片描述

容器是面向操作系统的,所以操作系统是容器的底层,镜像是一层层构建的。 dockerhub中央仓库提供了很多已完成的镜像,帮助用户省略一步一步的构建过程。

拉取的opennjdk还包含底层镜像,因此变得非常大。

dockerfile构建镜像并部署spring boot项目

编写dockerfile文件vim dockerfile-jdk

在这里插入图片描述

# 构建镜像
FROM openjdk:8
# 维护者西信息
MAINTAINER [email protected]
# 将主机文件复制到容器目录
ADD ./springboottest-0.0.1-SNAPSHOT.jar /root/www/app.jar
# 端口映射
EXPOSE 8080  # 起一个声明作用并不会实际映射,需要docker run -p映射
# 容器内运行命令
CMD java -jar /root/www/app.jar

sudo docker build -f ./dockerfile-jdk8 -t app .命令基于docckerfile构建容器。

-f执行dockerfile位置
-t给镜像起别名
.指定当前目录

在这里插入图片描述

docker minages查看构建的镜像

在这里插入图片描述

docker run命令直接构建并启动容器。dockerfile的cmd命令会直接当前docker run的启动命令执行。

也就是说直接将dockerfile中配置的参数作为docker run的启动参数命令。由于配置文件中配置了映射的端口、服务启动命令和共享文件夹,所以这里直接docker run镜像名称即可。 docker run的参数命令会覆盖配置文件的命令。

通过以下命令启动容器,如图

docker run -it -v $pwd:/root/www -p 8080:8080 app

在这里插入图片描述

使用dockerfile的便利性:

  1. 不再需要拉取镜像、配置分层镜像、配置共享文件夹等一系列步骤。
  2. 直接根据dockerfile文件通过docker build来构建镜像非常方便。 Docker run 可以非常方便的运行容器,并且避免了镜像版本冲突的问题。
  3. 提高了可重用性,任何开发者通过dockerfile构建的镜像都是完全相同的。
  4. 省略了docker run后的一堆参数,方便编写。

在这里插入图片描述

当构建镜像并通过dockerfile启动容器时,必须配置端口和共享文件夹。

. . .

相关推荐

额外说明

浅谈Java基本数据类型的自动装箱和拆箱机制

自动拆装箱机制说明 Java对8个基本数据类型有个自动拆装箱机制,使用方式类似如下 int i = new Integer(3); Integer i = 3; 会根据变量的类型对实际的对象做拆箱或者装箱,比如 把 new Integer(3) 拆

额外说明

MySQL事务和锁详解

事务 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败 事务的四大特性 原子性(atomicity):强调事务的不可分割. 一致性(consistency):事务的执行的前后数据的完整性保持一致. 隔离性(iso

额外说明

量化交易 第四课 回测交易接口

第四课 回测交易接口 概述 交易函数 指定股票交易 目标价值下单 交易注意事项 拒单 市价 vs 限价 交易的费用 投资组合 查看投资组合信息 context 属性 portfolio 对象 代码实现 概述 在建立自己的量化策略回测系统之前, 我们必须对

额外说明

《零基础安装 Oracle 数据库》单机系列 ② 一键快速安装 Oracle 12CR2 数据库

目录 前言 安装 下载项目 安装软件 下载 Oracle 安装包 安装 编辑 vagrant.yml 文件 开始安装 使用方式 连接主机 关闭主机 开启主机 销毁主机 写在最后 前言 很多朋友吐槽我的脚本不会用,看不懂,哎,一言难尽!于是,我将 [vag

额外说明

fatal error C1083: 无法打开包括文件: “opencv2/objdetect/objdetect.hpp”: No such file or directory

错误描述 ObjectDetection.cpp(20): fatal error C1083: 无法打开包括文件: “opencv2/objdetect/objdetect.hpp”: No such file or directory 问题分析 提示

额外说明

浏览器搜索结果和网页链接新标签页中打开

google搜索结果在新标签页打开: 访问https://www.google.com/ ,点击右下角Settings—> Search Settings ---->勾选Where results open Open each selected resu

额外说明

尝试使用Bouml创建用例图

文章目录 一、下载Bouml 二、安装Bouml 三、使用Bouml (一)创建项目 (二)创建子包 (三)创建用例图 Bouml是一个免费的UML 2工具箱,支持C++,Java以及Idl。 一、下载Bouml 官网:https://www.bouml

额外说明

Vue学习笔记:使用CLI构建Vue项目

Vue学习笔记:使用CLI构建Vue项目 一、安装Vue CLI 要用到集成在node.js里的npm来安装Vue CLI。 1、下载并安装node.js 2、配置node.js的环境变量 3、启动命令行,查看node版本 4、查看npm的版本 5、安装

额外说明

Hasor【环境搭建 03】Dataway接口配置服务使用DataQL聚合查询引擎(SQL执行器实现分页查询举例说明+报错 Query dialect missing 原因分析及解决)

1.报错说明 在本地搭建了两个平台,hasor核心依赖的版本是一致的, 连接的都是GreenPlum数据库 ,且执行的是相同的DataQL语句: <!--hasor核心依赖【是老平台接入,由于兼容问题,最终用的并不是最新的4.2.5版本】

ads via 小工具