您的位置:首页 > 运维架构 > Docker

Docker的使用笔记

2021-08-24 10:47 811 查看

介绍Docker

Docker为了解决依赖的兼容问题的,采用了两个手段:

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包

  • 将每个应用放到一个隔离容器去运行,避免互相干扰

Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统

  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰

  • 启动、移除都可以通过一行命令完成,方便快捷

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统

  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是**容器**,只是Docker会给容器进程做隔离,对外不可见。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的**文件**。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

DockerHub

DockerHub是一个官方的Docker镜像的托管平台。

 

安装Docker(基于CentOS7)

 

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。

卸载之前的Docker

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce

 安装 

yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken

  更新本地镜像源

# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

  然后输入命令

yum install -y docker-ce

  启动Docker之前要关闭防火墙,因为Docker所需要调用的端口很多,为避免被防火墙拦截

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

  通过命令启动docker

systemctl start docker  # 启动docker服务
systemctl stop docker  # 停止docker服务
systemctl restart docker  # 重启docker服务

  然后输入命令,可以查看docker版本

docker -v

  配置镜像加速(参考阿里云镜像加速器文档)

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

  

DockerCompose

Compose文件是一个文本文件,定义、运行多个容器,通过yml配置,再通过指令定义集群中的每个容器如何运行,就像运行一个脚本。

下载DockerCompose

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改文件权限

# 修改权限
chmod +x /usr/local/bin/docker-compose

Base自动补全命令

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

  

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

  

镜像操作

首先来看下镜像的名称组成:

  • 镜名称一般分两部分组成:[repository]:[tag]。

  • 在没有指定tag时,默认是latest,代表最新版本的镜像

拉取、查看镜像

 根据在DockerHub查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx

通过命令:docker images 查看拉取到的镜像

 

保存、导入镜像

 查看save命令用法,可以输入命令:docker save --help

docker save -o [保存的目标文件名称] [镜像名称]

使用docker save导出镜像到磁盘

docker save -o nginx.tar nginx:latest

  

使用docker load加载镜像

 删除本地的nginx镜像

docker rmi nginx:latest

  

运行命令,加载本地文件:

 
docker load -i nginx.tar

 

容器操作

 

容器保护三个状态:

  • 运行:进程正常运行

  • 暂停:进程暂停,CPU不再运行,并不释放内存

  • 停止:进程终止,回收进程占用的内存、CPU等资源

 

其中:

  • docker run:创建并运行一个容器,处于运行状态

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

创建并运行一个容器

docker run --name containerName -p 80:80 -d nginx

  

命令解读:

- docker run :创建并运行一个容器
- --name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx

 

这里的`-p`参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

 

数据卷(容器数据管理)

 

 数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

数据卷操作的基本语法:docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume

  • inspect 显示一个或多个volume的信息

  • ls 列出所有的volume

  • prune 删除未使用的volume

  • rm 删除一个或多个指定的volume

创建和查看数据卷

创建数据卷

 
docker volume create html

  查看所有数据

docker volume ls

  

查看数据卷详细信息卷

 
docker volume inspect html

  

挂载数据卷

 

docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

  

这里的-v就是挂载数据卷的命令:

  • -v html:
    把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中

 查看在本地磁盘数据卷位置

# 查看html数据卷的位置
docker volume inspect html

  

 

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

  • 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录

  • 直接挂载模式:宿主机目录 ---> 容器内目录

 

目录挂载与数据卷挂载的语法是类似的:

  • -v [宿主机目录]:[容器内目录]

  • -v [宿主机文件]:[容器内文件]

数据卷挂载与目录直接挂载的区别:

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找

  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

 

Dockerfile自定义镜像

常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

基于Ubuntu构建Java项目

步骤1:新建一个空文件夹docker-demo

步骤2:拷贝jar文件到docker-demo这个目录

步骤3:拷贝jdk8.tar.gz文件到docker-demo这个目录

步骤4:拷贝Dockerfile到docker-demo这个目录

Dockerfile:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

步骤5:将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下

步骤6:运行命令:

docker build -t javaweb:1.0 .

  

基于java8构建Java项目

虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

 

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

  • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  • ② 拷贝课前资料提供的docker-demo.jar到这个目录中

  • ③ 编写Dockerfile文件:

    a )基于java:8-alpine作为基础镜像

  • b )将app.jar拷贝到镜像中

  • c )暴露端口

  • d )编写入口ENTRYPOINT

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar

  

小结:

  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程

  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建

  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

Docker-Compose

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

 示例:

version: "3.8"
services:
  mysql:
    image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"

  

上面的Compose文件就描述一个项目,其中包含两个容器:

  • mysql:一个基于

    mysql:5.7.25
    镜像构建的容器,并且挂载了两个目录

  • web:一个基于

    docker build
    临时构建的镜像容器,映射端口时8090

version: "3.2"

services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"

  

可以看到,其中包含5个service服务:

  • nacos
    :作为注册中心和配置中心

    image: nacos/nacos-server
    : 基于nacos/nacos-server镜像构建

  • environment
    :环境变量

    MODE: standalone
    :单点模式启动

  • ports
    :端口映射,这里暴露了8848端口

  • mysql
    :数据库

      image: mysql:5.7.25
      :镜像版本是mysql:5.7.25

    • environment
      :环境变量

      MYSQL_ROOT_PASSWORD: 123
      :设置数据库root账户的密码为123

  • volumes
    :数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据

  • userservice
    orderservice
    gateway
    :都是基于Dockerfile临时构建的

  • 修改微服务配置

    因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。

    spring:
    datasource:
    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
    application:
    name: orderservice
    cloud:
    nacos:
    server-addr: nacos:8848 # nacos服务地址

      

     打包(包名)

    可以通过修改pom.xml中的打包名称来实现

    <build>
    <!-- 服务打包的最终名称 -->
    <finalName>app</finalName>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

     

    拷贝jar包到部署目录

    编译打包好的app.jar文件,需要放到Dockerfile的同级目录中

     

    部署

     们需要将文件整个cloud-demo文件夹上传到虚拟机中,理由DockerCompose部署

    上传到任意目录,进入cloud-demo目录,然后运行下面的命令:

    docker-compose up -d

     

    Docker 仓库管理 

    目前 Docker 官方维护了一个公共仓库 Docker Hub

    注册

    https://hub.docker.com 免费注册一个 Docker 账号。

    登录

    docker login

      登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。

    退出

    docker logout

      拉取镜像

    可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地

    推送镜像

    用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub

     

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: