一 docker的介绍

Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup, namespace, Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程,这种运行时封装的状态称为容器。Docker早起版本实现是基于LXC,并进一步对其封装,包括文件系统、网络互联、镜像管理等方面,极大简化了容器管理。从0.7版本以后开始去除LXC,转为自行研发的libcontainer,从1.11版本开始,进一步演进为使用runC和containerd。
    Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序,程序之间相互隔离。

Containerd:是一个简单的守护进程,使用runC管理容器。向Docker Engine提供接口。
  Shim:只负责管理一个容器。
          runC:是一个轻量级的工具, 只用来运行容器。

1 docker的体系结构

Docker Client:客户端

Ddocker Daemon:守护进程

Docker Images:镜像

Docker Container:容器

Docker Registry:镜像仓库

2 docker的内部组件

Namespaces 命名空间    资源隔离

  UTS: 主机名和域名

  IPC: 消息队列 共享内存

  PID: 进程编号

  Network: 网络协议栈,例如IP、端口

  Mount: 文件系统

  User: 用户和用户组

  

CGroups 控制组  资源限制 比如CPU 内存 磁盘IO

UnionFS 联合文件系统       Copy-on-write

3 虚拟机与容器的差别

启动时间
    Docker秒级启动, KVM分钟级启动。

轻量级
    容器镜像大小通常以M为单位,虚拟机以G为单位。
    容器资源占用小,要比虚拟机部署更快速。

性能
    容器共享宿主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,容器性能基本接近物理机;
    虚拟机需要Hypervisor层支持,虚拟化一些设备,具有完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好。

安全性
    由于共享宿主机内核,只是进程级隔离,因此隔离性和稳定性不如虚拟机,容器具有一定权限访问宿主机内核,存在一定安全隐患。

使用要求
    KVM基于硬件的完全虚拟化,需要硬件CPU虚拟化技术支持;
    容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。

4 应用场景

应用程序打包和发布

应用程序隔离

持续集成

部署微服务

快速搭建测试环境

提供PaaS产品(平台即服务)

 

二 docker的安装

1 安装

centos7.X安装docker

docker 版本

  

  社区版(Community Edition,CE)

  企业版(Enterprise Edition,EE)

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加软件源信息 源地址换成阿里

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum包索引
yum makecache fast

# 安装Docker CE
yum install docker-ce

# 启动
systemctl start docker

systemctl enable docker

#卸载centos自带的firewall

systemctl stop firewalld.service #关闭防火墙

systemctl disable firewalld.service #关闭开机启动

官方文档:https://docs.docker.com

阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2 配置 国内镜像仓库

#配置国内镜像仓库的加速器

https://www.daocloud.io/mirror#accelerator-doc
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

#Docker配置文件
/etc/docker/daemon.json

三 镜像管理

     简单说, Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。         Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像, Docker工具

1 镜像与容器的关系

  镜像不是一个单一的文件,而是有多层构成。 我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。 Docker镜像默认存储在/var/lib/docker/<storage-driver>中。

  容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动, 都会写到这个读写层。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

2 镜像的常用操作

# 列出本地镜像
docker image ls

# 删除某个镜像
docker image rm nginx_test

# 下载一个镜像
docker image pull mongo:3.4

# 查看中间层镜像
docker images -a

# 删除镜像 强制删除
docker image rm mongo:3.4
docker image rmi nginx:1.16

# 查看镜像的详细信息
docker image inspect centos:6.9

#save 与load

导出一个完整镜像

docker image save nginx:1.16 >nginx_save.tar

# 导入镜像 load
docker image load -i nginx_save.tar

# export 与 import
export 导出的是容器的文件系统的所有内容, 不包括分层,不包括运行命令

# 导出镜像
docker container export webserver > nginx.tar

# 导入镜像
docker image import webserver.tar nginx_august

# 运行镜像 nginx容器
docker run --name test_nginx -itd -p 80:80 nginx_august /bin/bash -c "echo 'hello' && exec nginx -g 'daemon off;'"
docker run --name test_nginx -itd -p 80:80 nginx_august /bin/bash -c "exec nginx -g 'daemon off;'"

四 容器管理

1 容器操作命令

docker container run --help

-i
-t
-d
-e 传变量
-p 端口映射
-h 主机名
--dns

--restart 开机启动容器
--restart=always

# 创建一个容器
docker run --name webserver -d -p 80:80 nginx:1.16

# 查看容器日志
docker container logs web01

# 执行容器命令
docker exec web01 ls

# 进入容器
docker exec -it web01 bash

# 查看容器的映射端口
[root@test ~]# docker container port web02
80/tcp -> 0.0.0.0:808

# 宿主机中的目录 映射到容器中
docker container run -itd --name web01 -v /data/co1/:/usr/share/nginx/html/ -p 80:80 nginx:1.16

# 查看容器的具体改动
docker diff webserver

# 根据容器的改变创建新的镜像
docker commit -a "augustyang@qq.com" -m "修改默认网页" webserver nginx:v2

# 删除全部stop的容器
docker rm $(docker ps -aq)

2 容器管理命令

# ls 列出容器
docker container ls

# inspect 显示一个容器的详细信息
docker container inspect web01

# exec 在容器运行命令
docker container exec web01 ls

# logs
docker container logs web01

# 显示容器运行的进程
docker container top web01

# update 
docker container update web01 -m 100m --memory-swap -1

#cp 宿主机的文件拷贝到容器中
docker cp ysl web01:/usr/share/nginx/html

# port 映射端口
docker container port web01

# stats 查看资源利用率
docker stats web01

不用交互
docker stats --no-stream web01

五 管理应用程序

Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes, bind mounts 和tmpfs

  volumes: docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

  bind mounts: 可以存储在宿主机系统的任意位置

  tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

1 卷的创建与删除

管理卷创建:
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol

用卷创建一个容器:
# docker run -d -it --name=nginx-test --mount source=nginx-vol,target=/usr/share/nginx/html nginx
或者
# docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

清理操作:
docker container stop nginx-test
docker container rm nginx-test
docker volume rm nginx-vol

注意:
  1. 如果没有指定卷,自动创建。
  2. 建议使用—mount,更通用

2 部署测试lnmp

docker container run -itd \
--name lnmp_mysql \
--net lnmp \
-p 3306:3306 \
--mount type=bind,source=/data/mysql,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6 --character-set-server=utf8

docker container exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'

docker container run -itd \
--name lnmp_web \
--net lnmp \
-p 80:80 \
--mount type=bind,source=/data/www,target=/var/www/html \
richarvey/nginx-php-fpm

六 网络模式

bridge
    默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
host
    容器不会获得一个独立的network namespace,而是与宿主机共用一个。
none
    获取独立的network namespace,但不为容器进行任何网络配置。
container
    与指定的容器使用同一个network namespace,网卡配置也都是相同的。
自定义
    自定义网桥,默认与bridge网络一样。

七 dockfile构建

1 dockerfile的指令

2 常用的dockerfile

redis dockerfile

FROM centos:6.9
# centos 6.9
# redis-3.2.5
MAINTAINER augustyang
ARG REDIS_VERSION="3.2.5" ADD redis-3.2.5.tar.gz /opt
RUN yum -y install gcc-c++ make gcc \
&& mkdir -p /data/redis/data \
&& cd /opt/redis-$REDIS_VERSION && make && make install \
&& cd /opt/redis-$REDIS_VERSION/utils/ && echo | /bin/bash install_server.sh \
&& /bin/cp /opt/redis-$REDIS_VERSION/redis.conf /etc/redis/6379.conf \
&& sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis/6379.conf \
&& sed -i 's/# requirepass foobared/requirepass 123456/g' /etc/redis/6379.conf \
&& /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \
&& sed -i 's@dir ./$@dir /data/redis/data@g' /etc/redis/6379.conf \
&& yum clean all \
&& rm -rf /var/cache/yum/* WORKDIR /data/redis EXPOSE 6379
ENTRYPOINT /usr/local/bin/redis-server /etc/redis/6379.conf && tail -f -n20 /var/log/redis_6379.log

nginx dockerfile

FROM centos:7
LABEL maintainer augustyang
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/* COPY nginx-1.15.5.tar.gz /
RUN tar zxf nginx-1.15.5.tar.gz && \
cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "ok" >> /usr/local/nginx/html/status.html && \
cd / && rm -rf nginx* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

tomcat dockerfile

FROM centos:7
MAINTAINER augustyang
# tomcat ENV VERSION=8.5.43 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/* COPY apache-tomcat-${VERSION}.tar.gz /
RUN tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
mkdir /usr/local/tomcat/webapps/test && \
echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin WORKDIR /usr/local/tomcat EXPOSE 8080
CMD ["catalina.sh", "run"]

java dockerfile

FROM java:8-jdk-alpine
LABEL maintainer augustyang
# java
ENV JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
RUN apk add -U tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY ./target/eureka-service.jar ./
EXPOSE 8888
CMD java -jar $JAVA_OPTS /eureka-service.jar

php dockerfile

FROM centos:7
MAINTAINER augustyang
# php RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/* COPY php-5.6.36.tar.gz /
RUN tar zxf php-5.6.36.tar.gz && \
cd php-5.6.36 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --with-mcrypt --enable-hash && \
make -j 4 && make install && \
cp php.ini-production /usr/local/php/etc/php.ini && \
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \
mkdir /usr/local/php/log && \
cd / && rm -rf php* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/php/sbin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]

注:ENTRYPOINT需要放在CDM前面 。

CMD    启动带参数会替换cmd内的内容

    启动容器带参数:所带参数替换默认参数

    启动容器没带参数:起默认参数,

ENTRYPOINT 不会替换 ENTRYPOINT内的内容

容器之docker基础的更多相关文章

  1. [知识点]C++中STL容器之map

    UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...

  2. Docker基础修炼1--Docker简介及快速入门体验

    本文作为Docker基础系列第一篇文章,将详细阐述和分析三个问题:Docker是什么?为什么要用Docker?如何快速掌握Docker技术? 本系列文章中Docker的用法演示是基于CentOS7进行 ...

  3. Docker - Docker基础命令及使用

    Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...

  4. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  5. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  6. 【云计算】Docker云平台—Docker基础

    Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...

  7. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

  8. Java并发编程:并发容器之CopyOnWriteArrayList

    转载: Java并发编程:并发容器之CopyOnWriteArrayList Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个 ...

  9. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  10. Docker 基础技术:Linux Namespace(下)

    导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...

随机推荐

  1. yarn使用 以及和npm对比

    yarn是facebook发布的一款取代npm的包管理工具. yarn的特点: 速度超快. Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载. 同时利用并行下载以最大化资源利用率,因此安装速 ...

  2. OpenMP For Construct dynamic 调度方式实现原理和源码分析

    OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...

  3. Linux服务器硬件及RAID配置

    Linux服务器硬件及RAID配置 一.RAID磁盘阵列介绍 独立冗余磁盘阵列(Redundant Array of Independent Disks) 作用: 把多块独立的物理硬盘按不同的方式组合 ...

  4. CAS 悲观锁 乐观锁

    前面的偏向锁,轻量级锁,重量级锁都是悲观锁, 都会认为必须要对操作对象进行互斥访问,不然就会产生异常, 所以线程只供一个线程使用,阻塞其他线程,是悲观的 在某些情况下,同步的耗时远大于线程切换的时间, ...

  5. pycharm软件的基本使用、python的注释语法、变量与常量、变量的命名风格、垃圾回收机制、数据类型、数据类型之整型、数据类型之浮点型

    一.pycharm软件的基本使用 修改主题背景 修改字体大小 切换解释器 如何新建python文件 创建后缀是py的文件 注意:pycharm的语言 一定要使用英文的 二.python语法注释 (1) ...

  6. .NET 和 .NET Core 使用 JWT 授权验证

    JWT介绍 参考文章 https://www.cnblogs.com/cjsblog/p/9277677.html 一..NET 中使用 1. NuGet包 搜索JWT,下载安装(本人用的是8.2.3 ...

  7. VS 撰写生成了多个撰写错误,其根本原因有X点,如下所列。有关详细信息,请查看CompositionException.Error属性

    打开VS开发程序,莫名其妙的出现如下图错误: 网上找了很多资料,有前辈说以下方法: 解决方案如下 打开文件夹 Users\<CurrentUser>\AppData\Local\Micro ...

  8. ROS入门:小海龟实验

    1.初试小海龟 1.roscore 2.rosrun turtlesim turtlesim_node 3.rosrun turtlesim turtle_teleop_key 2.发布话题控制小海龟 ...

  9. 接口自动化库-apist

    前言 目前很多公司用jmeter或者RF框架来实现接口自动化,确实是可以实现,但不利于CI/CD. 为了方便后续的可拓展性.可维护性.可复用性,项目leader在技术选型的时候应当以趋势.主流的为主, ...

  10. Hbase学习二:Hbase数据特点和架构特点

    转载请注明出处: 1.Hbase数据特点 大:一个表可以有上亿行,上百万列. 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索. 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以 ...