Docker基本使用

1、Docker简介

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。也就是说,当我们的程序或者软件需要部署到别的机器上运行时,由于软件运行起来需要安装很多的依赖,这些依赖(环境)配置起来非常繁琐,那么就可以在开发的时候就使用docker了。

Docker与宿主机共用硬件。Docker与宿主机共用内核。而传统的虚拟机把硬件也虚拟了。

标签:“更方便移植的‘虚拟机‘”、““轻量级的虚拟化技术”

1.1 Docker与传统虚拟机的比较

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

2、Docker相关概念

  1. 镜像 :文件存储系统,存储Docker所运行服务的全部文件。(可以理解为使用虚拟机安装Linux发行版本时所使用的iso文件。)
  2. 容器:镜像文件加载到系统后以容器的形式存在。(可以理解为已经安装好的虚拟机,不同的是:容器可以在1s内实现创建并运行)
  3. 仓库:存放镜像的地方(类似于github放代码的地方),最大的公开仓库是Docker Hup,我们一般可以pull别人做好的镜像来使用。

3、Docker安装

不要安装在windows系统,后期使用会很麻烦,会遇到各种各样的问题。

3.1 Ubuntu安装docker

sudo apt install docker.io

3.1.1查看安装成功的docker版本

docker version

3.1.2检测是否安装成功

sudo docker run hello-world

3.1.3 赋予普通用户使用docker的权限

sudo usermod -a -G docker $USER

4、Docker管理并使用

4.1 docker服务的启动与停止

# 启动docker
sudo service docker start

# 停止docker
sudo service docker stop

# 重启docker
sudo service docker restart

4.2 Docker基本操作

4.2.1 镜像操作

  • 搜索镜像
docker search 镜像名称
docker search django
  • 拉取镜像
docker pull django  #默认拉取最新的镜像
docker pull mysql:5.6 #拉取mysql的5.6版本
  • 查看已有镜像
docker images # 查看所有的镜像
docker images -q # 查看所有镜像的id
  • 删除镜像
docker rmi 镜像id
docker rmi 镜像名称
docker rmi scrapinghub/splash # 删除splash的镜像文件

4.2.2 容器操作

  • 创建容器
docker run -dit --name=myubuntu ubuntu:latest /bin/bash  # 创建一个myubuntu容器,使用的镜像是:ubuntu:latest
#创建一个mysql容器,将主机的3307端口映射到docke容器的3306端口,同时配置数据卷,并设定mysql密码。这时候,就可以在windows的Navicat中查看数据库。
docker run -id -p 3307:3306 --name=mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6

默认参数含义:

  • -i :表示以“交互模式”运行容器,默认使用 /bin/bash 交互
  • -t :表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
  • –name: 为创建的容器命名
  • -v: 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
  • -d :在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。也就是后台运行。
  • -p :表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
  • -e :为容器设置环境变量
  • –network=host :表示将主机的网络环境映射到容器中,容器的网络与主机相同
  • 查看容器
docker ps # 查看正在运行中的容器
docker ps -a # 查看所用容器
docker ps -aq # 查看所有容器的id
  • 进入容器
docker exec -it myubuntu /bin/bash
  • 退出容器
exit  # 在交互式容器下的terminal输入exit,即可退出容器
  • 停止容器
docker stop 容器名称
docker stop myubuntu
  • 启动容器
docker start 容器名称 
docker start myubuntu
docker restart myubuntu # 重启容器
  • 删除容器
docker rm 容器名称
docker rm myubuntu

5、镜像制作

5.1容器转为镜像

当我们需要移植容器的时候,可以将容器打包为镜像。将镜像文件上传到仓库,或者保存为文件。在被移植的机器上,获得镜像文件后,直接docker run 创建一个容器即可。

 docker commit 容器id 镜像名称:版本号  # 将自己的容器提交到本地,并创建自定义的镜像名称和版本号
 docker save -o 压缩文件名称 镜像名称:版本号 # 将已经commit的镜像,打包为压缩文件,方便移植
 docker load -i 压缩文件名称 # 将压缩文件转为镜像
# 例子
docker commit myubuntu myubuntu:1.0
docker save -o myubuntu_1_0.tar myubuntu:1.0
docker load -i myubuntu_1_0.tar
# 此时使用docker images 时,可以查看到已经加载好的mybuntu 1.0版本的镜像

5.2 将镜像推送到公有仓库

将自己的容器创建为镜像,并推送到自己在Docker Hub的账户。

docker login # 登录在docker hub创建的账户
docker tag 本地镜像 仓库镜像
# 例如
docker tag myubuntu:1.0 username/myubuntu:1.0 # 该命令将本地镜像推送到共有仓库自己的账户目录下,公有仓库的镜像名称和版本号是可以自定义的

5.3 将镜像推送到私有仓库

6、容器的数据卷

数据卷是宿主机中的一个目录或文件。其作用是:1、容器数据的持久化存储 2、外部机器和容器间接通信 3、容器之间数据交换

6.1 配置数据卷

  • 通过命令行挂载
# 创建容器时,使用-v参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
# 注意: 1、目录必须是绝对路径 2、如果目录不存在,会自动创建 3、可以挂载多个数据卷
 docker run -it --name=myubuntu -v /usr/local/docker/data:/root/data  myubuntu:1.0 /bin/bash # 宿主机会多出一个/usr/local/docker/data的文件夹与/root/data的内容是一致的
  • 数据卷容器:多容器进行数据交换

实现原理:创建一个数据卷容器,挂载一个宿主机的目录。让新创建的多个容器挂载到新创建的数据卷容器上。

# 创建数据卷容器,关键在: -v /volume
docker run -it --name=c1 -v /volume ubuntu:latest /bin/bash
# 创建两个容器,使用--volumes-from dataVolume 参数 设置数据卷
docker run -it --name=c2 -v --volumes-from c1 ubuntu:latest /bin/bash
docker run -it --name=c3 -v --volumes-from c1 ubuntu:latest /bin/bash
# c1 c2 c3 的根目录下都会有一个/volume文件夹,并且其中的数据是同步的

7、Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

主要用途:将容器中的操作保存成镜像,与之前移植容器的操作不同的是,dockerfile将容器内的操作写在文件中,更方便移植。

7.1 Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成
  • 最低端是bootfs,并使用宿主机的bootfs
  • 第二层是root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户角度看来,只存在一个文件系统
  • 一个镜像可以放在另一个镜像上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
  • 当从一个镜像启动容器的时候,Docker会在最顶层加载一个读写文件的系统作为容器。

7.2 使用Dockerfile定制镜像

文件的拷贝,不需要使用压缩包了,只需要dockerfile就可以,更加方便、快速地解决迁移问题

7.2.1 Dockerfile中指令的分类

  • 构建的基础镜像
    • 所有自定义镜像都会基于某个基础镜像
  • 维护者信息
    • 该镜像的维护者是谁
  • 镜像操作的指令
    • 构建镜像时执行的。比如:RUN 、ADD、COPY
  • 容器哦启动时执行的指令
    • 容器启动时才执行。比如CMD、ENV、EXPOSE

7.2.2 Dockerfile指令详解

FROM:定制的镜像都是基于 FROM 的镜像。

RUN:用于执行后面跟着的命令行命令。一般RUN后可接linux terminal的命令。

COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

ADD:ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似。一般不用ADD。

CMD :类似于RUN命令,用于运行程序,但二者运行的时间点不同。

  • CMD:容器运行起来时,执行相应的命令。
  • RUN:在构建(build)镜像的时候执行。

ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

AGR:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。(在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点)作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大

EXPOSE:仅仅只是声明端口。作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

7.2.3 使用Dockerfile 范例

步骤:1、 编写Dockerfile文件; 2、docker build -t 镜像名:版本号 <Dockerfile所在路径>

示例

# 指定基础镜像
FROM node:latest

# 指定维护者信息
MAINTAINER zs

# 切换工作目录
WORKDIR /usr/src

# 下载项目
RUN git clone https://github.com/zxy6173/manage-front.get

# 切换到项目根目录
WORKDIR /usr/src/manage-front

# 设置npm的下载源
RUN npm config set registry=https://registry.npm.taobao.org

# 下载依赖包
RUN npm install

# 当前容器启动时部署项目
CMD npm start

在命令行输入docker build -t project:1.0 .这里的”.“指的是dockerfile的路径是当前路径。之后docker ps 后就会有新的镜像。

全部评论

相关推荐

特斯联 后端开发 300 + 450餐补
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
1 1 评论
分享
牛客网
牛客企业服务