点击上方码农沉思录,选择“设为星标”优质文章,及时送达docker容器化部署应用可以简化应用的部署流程。假设部署一个应用需要在机器上安装和配置nginxtomcat,如果需要新增一台服务器,或者切换服务器,那么就要重复同样的操作,安装nginxtomcat并配置。容器化部署就是一次配置到处使用,将安装nginx配置nginx这一系列工作制作成一个镜像,在服务器上通过docker拉取镜像并启动容器即可,基于此实现集群自动伸缩。docker入门简单,用好难,特别是制作镜像。随便做一个镜像就是1g大小,这该怎么用。如果每次部署都要拉1g的镜像,想想都可怕。如果在Dockerfile中使用yum安装一些软件,build的时间会很长,加上镜像太大,传输也耗时。应尽量使用安装包安装替换yum安装,以及使用尽量小的基础镜像。使用Dockerfile构建镜像,我们可以理解为,docker基于Dockerfile中的FROM基础镜像,启动了一个容器,然后在容器中执行Dockerfile中定义的脚本,执行完成后再打包成镜像。docker的镜像是分层的,你可以先定制一个基础镜像,再通过基础镜像去实现差异化定制。比如部署一个java项目,每台机制都需要jdk,但并不是每台机器都需要安装nginx,那么就可以先制作一个jdk基础镜像。当然,制作jdk基础镜像也是基于更底层的基础镜像,比如centos。然后再基于jdk基础镜像制作nginx镜像,再制作应用镜像。制作应用镜像如果需要用到nginx就可以基于nginx镜像,不需要依赖nginx的就可以直接基于jdk镜像。docker的命令不需要记,动动手去试一试就记住了,记不住可以使用docker -help查看命令。新版本docker将命令规范了,如docker image是镜像相关的,docker container是容器相关的,同样,也可以使用docker container -help来查看命令帮助。Docker的端口、网络与容器卷学习doker除了镜像制作之外,还需要理解这三点:端口映射、网络模式、容器卷(volume)。

端口映射

将宿主机端口映射到容器的端口,外部通过访问宿主机端口从而访问容器内应用。如容器中redis使用的端口是6379,可以将宿主机的10880端口与容器的6379端口映射,外部通过宿主机ip10880端口访问容器中的redis

### 使用镜像运行容器### -p 10880:6379 将宿主机10880端口映射到容器6379端口[root@wujiuye01 redis-app]# docker container run -itd --name simple-redis \                 -p 10880:6379 wujiuye/simple-redis:5.0.705676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a### 宿主机访问容器中的redis[root@wujiuye01 redis-app]# /root/redis/redis-5.0.5/src/redis-cli -p 10880127.0.0.1:10880>

网络模式

docker支持5种网络模式,这里不做详细分析,因为我不是很了解。在启动容器时,可以指定使用哪种网络模式:docker container run --network [网络模式]

  • bridge: 默认使用,docket启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

  • host: 容器不会获得一个独立的network namespace,而是与宿主机共用一个。

容器卷(volume)

应用部署在一台服务器上运行会产生日记,不能随着容器的删除而导致日记被删除,所以需要将容器中的工作目录与宿主机的目录映射。或者说mysql容器,容器移除而数据库文件不能删除。docker为我们提供了三种不同的方式将容器卷或宿主机目录从宿主机挂载到容器中:volumebind mounttmpfs

volumes

docker管理宿主文件系统的一部分(/var/lib/docker/volumes/容器id)

  • 创建容器卷:docker volume create test-vol

  • 查看容器卷:docker volume inspect test-vol

  • 将容器卷挂载到容器的目录:docker container run -itd --name test --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0

--mount src=test-vol,dst=/data/apps/test: 将容器卷挂载到容器的/data/apps/test目录。将文件放到容器的/data/apps/test目录下,可以在宿主机的/var/lib/docker/volumes/test-vol目录看到,反过来也是一样的。如果不指定--mount,默认也是使用volumes,并且容器卷的名称就是容器id,也是在/var/lib/docker/volume/目录下。

### 创建容器卷[root@wujiuye01 docker]# docker volume create test-voltest-vol### 查看容器卷信息[root@wujiuye01 docker]# docker volume inspect test-vol[    {"CreatedAt": "2020-01-04T17:57:08+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/test-vol/_data","Name": "test-vol","Options": {},"Scope": "local"    }]### 将容器卷挂载到容器[root@wujiuye01 docker]# docker container run -itd --name test \        --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0

bind mounts

可以存储在宿主机系统的任意目录,宿主机的目录必须存在。如果宿主机新增磁盘是挂载在/data目录的,建议使用这种。如使用awsec2实例。

docker container run -itd --name test --mount type=bind,src=宿主机目录,dst=容器目录 wujiuye/test:1.0.0

将指定的宿主机目录挂载到容器的指定目录。将文件放到下,可以在看到,反过来也是一样的。

tmpfs

挂载存储在宿主机系统的内存中,不会写入宿主机的文件系统Docker的安装与启动

docker安装

# 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。sudo yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-engine# 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2sudo yum install -y yum-utils \  device-mapper-persistent-data \  lvm2# 设置稳定的仓库。sudo yum-config-manager \    --add-repo \    https://download.docker.com/linux/centos/docker-ce.repo# 安装最新版本的 Docker Engine-Community 和 containerdsudo yum install docker-ce docker-ce-cli containerd.io

docker服务启动与停止

## 停止sudo systemctl stop docker## 启动sudo systemctl start docker

Docker使用简单事例

制作一个简单的redis镜像

准备redis安装包和配置文件,新建一个Dockerfile文件,目录结构如下:

-rw-r--r-- 1 root root     583 Jan  4 18:56 Dockerfile-rw-r--r-- 1 root root 1984203 Jan  4 18:52 redis-5.0.7.tar.gz-rw-r--r-- 1 root root   61797 Jan  4 18:52 redis.conf

编写Dockerfile文件,基于centos:7镜像

FROM centos:7MAINTAINER wujiuye # 使用ps 命令 :ps -ef|grep redisRUN yum install -y procps# redis安装包和配置文件ADD redis-5.0.7.tar.gz /usr/local/redis/COPY redis.conf /usr/local/redis/local-redis.conf# 安装gccRUN yum install gcc -y# 安装makeRUN yum install make -y# 编译redisRUN cd /usr/local/redis/redis-5.0.7 && \    makeRUN yum clean allEXPOSE 6379# 启动redisENTRYPOINT /usr/local/redis/redis-5.0.7/src/redis-serverCMD ["/usr/local/redis/local-redis.conf"]
  • 1、COPYADD命令的src只能使用相对路径,需要将文件拷贝到Dockerfile的同级目录下

  • 2、不要将redis安装包与redis配置文件COPYADD到容器的挂载目录下,否则因宿主机的源目录下没有这些文件,容器启动起来就找不到这些文件。构建镜像时将文件放在容器的/data/apps/目录下,而启动容器时配置宿主机目录挂载到容器的/data/apps/docker会将镜像中原有的/data/apps/目录移除,才可以挂载。

  • 3、RUM运行多条命令可使用&&符号连接,也可以写多个RUN

构建镜像

### 目录下的文件[root@wujiuye01 redis-app]# lsDockerfile  redis-5.0.7.tar.gz  redis.conf### 构建镜像[root@wujiuye01 redis-app]# docker image build --tag wujiuye/simple-redis:5.0.7 .....Successfully built 2aab79854763Successfully tagged wujiuye/simple-redis:5.0.7

--tag打标签,最后的‘.’Dockerfile文件所在的位置。

根据镜像启动容器

docker container run \--rm -itd \--ulimit nofile=102400:102400 \--name=simple-redis \-p 10880:6379 \  # 可写多个--mount type=bind,src=/data/redis-app/,dst=/usr/local/redis \wujiuye/simple-redis:5.0.7
  • --rm: 如果容器存在则删除,只是移除容器,正在运行的容器不会停止

  • --name=simple-redis: 给容器取一个名字

  • -itd-i-t-d的结合

  • --ulimit nofile=102400:102400 设置ulimit

  • -p 10880:6379 宿主机与容器的端口映射

  • --mount type=bind,src=...,dst=... 文件系统为bind mountsrc为宿主机的目录,dst为容器中的目录

查看容器信息

[root@wujiuye01 redis-app]# docker container ls### 容器id  使用的镜像 容器执行的命令 创建时间   容器状态  端口信息  容器名称CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                     NAMES05676da44583        wujiuye/simple-redis:5.0.7   "/bin/sh -c /usr/loc…"   6 minutes ago       Up 6 minutes        0.0.0.0:10880->6379/tcp   simple-redis

将镜像push到docker hub

在测试完镜像可用之后,可以选择push到远程仓库,也可自己搭建一个镜像仓库。

  • 1)、注册hub.docker.com账号,id不要随便填写,如:wujiuye

  • 2)、创建一个仓库,如:wujiuye/simple-redis

  • 3)、如果需要,将本地的镜像打标签,对应到远程仓库,如:docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7。本地镜像与远程仓库镜像标签不同时使用。

  • 4)、docker login 输入用户名密码登陆

  • 5)、docker push wujiuye/simple-redis:5.0.7 推送镜像至远程仓库

[root@wujiuye01 redis-app]# docker push wujiuye/simple-redis:5.0.7The push refers to repository [docker.io/wujiuye/simple-redis]dafbadcc43aa: Pushing [==>                                                ]  1.281MB/23.62MB879a0e8874ba: Pushing [=============================>                     ]  66.96MB/111.8MBccc522a455bc: Pushing [>                                                  ]  549.9kB/100.2MB879a0e8874ba: Pushing [================================>                  ]  73.04MB/111.8MBccc522a455bc: Pushing [>                                                  ]  1.107MB/100.2MBff7b8add839d: Pushing [=================>                                 ]  51.75MB/146.8MBdca066a10cae: Pushing [>                                                  ]  557.1kB/100.8MB77b174a6a187: Waiting

Other

容器停止

1)、docker kill [容器名]可选参数:--signal: 发送信号量2)、docker stop []

删除容器和镜像

  • 1)、删除所有镜像:docker rmi $(docker images -q)

  • 2)、删除所有容器:

1)、先停止所有容器:docker stop $(docker ps -a -q)2)、删除所有容器:docker rm $(docker ps -a -q)

删除某个镜像:

1)、docker image rm [repository,如:wujiuye/simple-redis:5.0.7]2)、docker image rm [镜像id]

删除某个容器:

docker container rm [容器名称 或 容器id]

祝大家在2020年工作顺路,家庭幸福,合家团圆

docker新增目录映射_开发也需了解的运维知识之Docker相关推荐

  1. Docker容器虚拟化技术---Docker运维管理(Docker Compose)4

    Docker容器虚拟化技术-Docker运维管理(Docker Compose)4 Docker Compose 通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的 ...

  2. 企业运维容器之 docker仓库

    企业运维容器之 docker 仓库 1. 什么是仓库? 2. Docker hub 3. Registry 工作原理 4. 配置镜像加速器 5. 搭建私有仓库 5. 总结 1. 什么是仓库? Dock ...

  3. Kubernetes CKA认证运维工程师笔记-Docker快速入门

    Kubernetes CKA认证运维工程师笔记-Docker快速入门 1. Docker 概念与安装 1.1 Docker 是什么 1.2 Docker 基本组成 1.3 版本与支持平台 1.4 Do ...

  4. 运维开发学go还是python_运维工程师是要学python还是学go那?

    在我们的认知中,运维工程师就是一个背锅侠,那么咱们怎么样来避免做背锅侠那? 可能有人会告诉你,你需要去懂一门开发语言,其实在现价段,掌握一门开发语言已经成为高级运维工程师的必备计能.不会开发,你就不能 ...

  5. linux cp 目录不存在自动创建,Linux运维知识之Linux:复制并创建目标目录,如果它不存在...

    本文主要向大家介绍了Linux运维知识之Linux:复制并创建目标目录,如果它不存在,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 我需要一个命令(或者可能是cp的一个选项)来 ...

  6. linux环境 前端开发环境搭建,Linux运维知识之linux 前端环境搭建

    本文主要向大家介绍了Linux运维知识之linux 前端环境搭建,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 1.下载node.js 2.在linux 里使用wget命令 w ...

  7. 那些年你追过的女神:开发人员应该懂多少运维

    编者按:在别的地方搜索一下这个看不出性别的简介真心没多大意思.陈爱珍,DBA+社群中间件云用户组联合发起人,上海中间件用户组负责人,新炬网络技术专家,7年运维经验,涉及电信.金融.税务等行业,精通主流 ...

  8. linux 查找删除目录,Linux运维知识之Linux系统下find命令递归删除查找目录的方法...

    本文主要向大家介绍了Linux运维知识之Linux系统下find命令递归删除查找目录的方法,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 本文将会讲述如何使用linux系统下的 ...

  9. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。...

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

最新文章

  1. 微信小程序生成小程序二维码 php 直接可以用
  2. UVA 11020 - Efficient Solutions(set)
  3. MySQL存储过程_创建-调用
  4. (传送门)instant run原理
  5. nginx和apache 配置
  6. Python 循环控制语句-break/continue
  7. exception:Deleted row information cannot be accessed through the row处理
  8. 阻塞(Block)和非阻塞(Non-Block)
  9. 英才计划计算机潜质测评试题,湖北省2020年“英才计划”潜质测试的通知
  10. 计算机辅助语文识字教学的优势,小学语文计算机辅助教学研究
  11. R语言的常用函数速查
  12. 存储过程和存储函数和触发器示例
  13. error: ‘VPX_IMG_FMT_RGB32’ undeclared (first use in this function); did you mean ‘VPX_IMG_FMT_NV12’?
  14. Python 中的闭包
  15. 移动数据通信网络工作原理(SGSNGGSN)
  16. 聚类算法-k均值聚类(K-means)
  17. amcharts4 总结
  18. html网站设计项目心得,网页设计制作心得体会,网页设计实训报告步骤
  19. Juniper路由器基本命令及中文解
  20. 2.3、JavaScript 数据类型 - 数字类型

热门文章

  1. 人工智能发展弊端的解决方案_高中优秀作文赏析:科技创新、人工智能与人类未来之辩...
  2. android file 创建时间,获得文件的创建时间(精确到时分秒)
  3. idea使用leecode插件
  4. MySQL-BETWEEN AND范围查询问题
  5. 服务器自动安全审计,用于Linux服务器的自动安全审计工具
  6. ffmpeg rtmp 封装发送函数_FFmpeg发送流媒体的命令(UDP,RTP,RTMP)
  7. react native 之自定义顶部导航栏,实现标题居中可控
  8. 【机器学习】集成学习与模型融合方法举例
  9. 机器学习(MACHINE LEARNING)MATLAB和Python混合编程
  10. python【Matlibplot绘图库】Animation动画(真の能看懂~!)