华为云上配置docker

最近华为云与牛客做活动,只要9块钱就可以获得一年的服务器,真心觉得太棒了,大爱牛客!

环境:

服务器:华为云centos7

Docker与传统虚拟化方式

虚拟机缺点:

  1. 资源占用多
  2. 冗余步骤多
  3. 启动慢

不同之处:

  • 传统虚拟化技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上在运行所需应用进程
  • 而容器内得应用进程直接运行于宿主得内核,容器没有自己得内核,而且也没有进行硬件虚拟。因此要比传统虚拟机更为轻便

优势:

  • 轻量,秒级得快速启动速度
  • 简单,易用,活跃的社区
  • 标准统一的打包/部署/运行方案
  • 镜像支持增量分发,易于部署
  • 易于构建,良好的REST API,也很适合自动化测试和持续集成
  • 性能,尤其是内存和IO的开销

(Centos下仅支持6.5以上的版本)

Docker三要素

  1. (类模板)镜像(image):一个只读模板。镜像可以来创建Docker容器,一个镜像可以创建很多容器。
  2. (对象实例)容器(container):看作是一个简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等) 和运行在其中的应用程序

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一的区别在于容器的最上面那一层是可读可写的。

  1. 仓库(repository):集中存放镜像文件的场所。

Centos7安装Docker

#卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

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

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

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

systemctl start docker

配置阿里镜像

mkdir -p /etc/docker

vim tee /etc/docker/daemon.json
#编写文本如下
{
  "registry-mirrors": ["https://we9yfuxn.mirror.aliyuncs.com"]
}

systemctl daemon-reload

systemctl restart docker

运行一个hello world镜像

docker run hello-world

运行的整个过程类似于maven的工作过程,现在本地找,然后去远程docker仓库查找

运行底层原理

Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时的环境。

基本指令

帮助命令

#查看版本信息
docker version

#具体信息
docker info

#查看命令
docker --help

镜像命令

#查看本地镜像
docker images

#查找镜像[列出收藏数不小于指定值的镜像]]
docker search [-s number] <name>

#拉取镜像
docker pull <name>

#删除镜像
docker rmi [-f] <ID1> [<iD2>...]

#删除全部镜像
docker rmi -qa

容器命令

#启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#OPTIONS说明
#--name='容器新名字':为容器指定一个名称
#-d:后台运行容器,并返回容器ID,也即启动守护式容器(如果没有可交互的前端,会自动退出)
#-i:以交互式模式运行容器,通常与-t同时运行
#-t:为容器重新分配一个伪输入终端,通常与-i同时使用

#列出当前所有正在运行的容器
docker ps 

#容器推出
exit        #容器停止退出
ctrl+P+Q    #容器不停止退出

#启动容器
docker start <name>

#重启容器
docker restart <name>

#停止容器,缓慢停止
docker stop <name> 

#强制停止
docker kill <name>

#删除已经停止的容器
docker rm [-f] <name>
#-f     强制关闭并删除

#查看容器日志
docker logs -f -t --tail <name>
#-t                 时间戳
#-f                 跟随最新的日志打印
#--tail <number>    显示最后多少条

#查看容器内进程
docker top <name>

#查看容器内部细节
docker inspect <name>

#重新进入容器并以命令行交互
docker attach <name>
#不用进入容器
docker exec -t <name> <bashShell>

#将容器内的文件拷贝到主机上
docker cp <name>:<容器内路径> <目的主机路径>

#映射docker镜像端口<port2>到主机端口<port1>
docker run -it -p <port1>:<port2> <name>
#随机映射端口
docker run -it -P <name>

#提交
docker commit

容器数据卷

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

容器卷如果设置只读权限,就只能主机到docker的单向传递,禁止容器内对文件的修改

DockerFile添加

  1. 根目录下新建mydocker文件夹并进入

  2. 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

  3. File构建

    • 编写dockfile文件
      FROM centos
      VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
      CMD echo "finished,----------------success1"
      CMD /bin/bash
  4. build后生成镜像

    docker build -f /mydocker/dockerfile -t chase/centos .
  5. run容器

    docker run -it chase/centos
  6. 可以通过 docker inspect指令来查看主机文件夹位置

    Mounts": [
            {
                "Type": "volume",
                "Name": "80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625",
                "Source": "/var/lib/docker/volumes/80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },

    可以看出文件夹位置是 /var/lib/docker/volumes/80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625/对应/dataVolumeContainer2

容器间数据卷共享

#启动一个父容器
docker run -it --name dc01 chase/centos

docker run -it --name dc02 --volumes-from dc01 chase/centos
docker run -it --name dc03 --volumes-from dc01 chase/centos

由上文可以知道,创建chase/centos的时候会创建容器数据卷,所以dc01,dc02,dc03都各自有两个容器数据卷,且这两个容器数据卷在三个容器中均是同步的,例如:在dc01中创建文件 dc01.txt 在其余两个容器中也会有 dc01.txt 文件。即使关闭dc01容器,同步过程依然存在

DockerFile解析

语法

  1. 每条保留字指令都必须为大写字母且后面都跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. # 表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

docker三个阶段

  • DockerFile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行状态

DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维

docker的三个阶段

DockerFile体系结构

1. FROM

基础镜像,当前镜像是基于哪个镜像的

2. MAINTAINER

镜像维护者的姓名与邮箱地址

3. RUN

容器构建时需要运行的命令

4. EXPOSE

当前容器对外暴露出的端口

5. WORKDIR

指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

6. ENV

用来构建镜像过程中设置环境变量(key-value键值对)

7. ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

8. COPY

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径> 位置

9. VOLUME

容器数据卷,用于数据保存和持久化工作

10. CMD

指定一个容器启动时要运行的命令。DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

11. ENTRYPOINT

指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

12. ONBUILD

带构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后父镜像的build被触发

自定义镜像

基础知识

Base镜像(scratch)-Docker Hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

  1. 编写:编写DockerFile文件
  2. 构建
docker build -t 新镜像名字:TAG .
  1. 运行
docker run -it 新镜像名字:TAG

案例

使centos镜像支持vim,默认进入位置为 /usr/local并且支持ifconfig

文件路径: /mydocker/ 下 dockerfile2 文件

FROM centos

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success-----------ok"
CMD /bin/bash

构建:

docker build -f /mydocker/dockerfile2 -t mycentos:1.3 .

运行:

docker run -it mycentos:1.3

使用

mysql

#启动mysql
docker run -p 12345:3306 --name mysql -v /chase/mysql/conf:/etc/mysql/conf.d -v /chase/mysql/logs -v /chase/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

说明:映射到3306,并建立两个容器数据卷,方便修改配置和查看日志,以密码123456启动

#导出数据库
docker exec <id> sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /chase/all-databases.sql

说明:exec使不进入docker就执行命令,将所有数据库导出到本机的/chase/all-databases.sql 中

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务