容器之docker基础
一 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基础的更多相关文章
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- Docker基础修炼1--Docker简介及快速入门体验
本文作为Docker基础系列第一篇文章,将详细阐述和分析三个问题:Docker是什么?为什么要用Docker?如何快速掌握Docker技术? 本系列文章中Docker的用法演示是基于CentOS7进行 ...
- Docker - Docker基础命令及使用
Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- 【云计算】Docker云平台—Docker基础
Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
- Java并发编程:并发容器之CopyOnWriteArrayList
转载: Java并发编程:并发容器之CopyOnWriteArrayList Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个 ...
- Docker基础技术:Linux Namespace(下)
在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...
- Docker 基础技术:Linux Namespace(下)
导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...
随机推荐
- PHP转Go实践:xjson解析神器「开源工具集」
前言 近期会更新一系列开源项目的文章,新的一年会和大家做更多的开源项目,也欢迎大家加入进来. xutil 今天分享的文章源自于开源项目jinzaigo/xutil的封装. 在封装过程中,劲仔将实现原理 ...
- Kubernetes(k8s)配置文件管理:ConfigMap
目录 一.系统环境 二.前言 三.ConfigMap概览 四.创建ConfigMap 五.ConfigMap的使用 5.1 以环境变量的方式使用ConfigMap 5.2 以卷的方式使用ConfigM ...
- java基础(六):面向对象
面向对象 面向对象:以类的方式组织代码,以对象组织数据 特性: 封装 继承 多态 类:抽象概念 对象:具体事物 面向对象是java学习的重中之重,毕竟java就是一个面向对象的语言~ 类 = 属性+方 ...
- drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用
目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...
- GDOI 2021 PJ 总结
Day 0.5 在门口等了好久,终于进去了. Day 1 下午来到考场,发现自己承诺书没有拿,然后就跑到宿舍去拿,回来发现只要身份证. T1一眼是个博弈,发现不太好打,先跳. T2发现最多消耗4320 ...
- Thymeleaf中判断Security权限 - SpringBoot
参考:https://blog.csdn.net/perfect_red/article/details/110821582
- LeetCode_单周赛_332
6354. 找出数组的串联值 题意 将数组首尾元素接在一起,就是串联值. 串联之后删除,如果只剩下一个元素,加上这个元素即可 双指针,从首和尾向中间移动即可 code 注意:用 long 没看题目用了 ...
- vue+.net入门级书签项目
vu3+.net6 webApi 书签管理项目 前言 Gitee项目地址:https://gitee.com/zyplj/book-marks Github项目地址:https://github.co ...
- 微信小程序【关于地址信息的接入以及自动选择当前位置】
在做收货地址的时候,通常会让用户填写或者打开地图选择收获地址,此时就需要用到微信提供的地址API,在使用地址API的时候需要注册对应的API,而且地址API会经常调整,需要关注官方公告,下面就是关于地 ...
- JZOJ 3745. 【NOI2014模拟7.14】Problem A
\(\text{Problem}\) 我们有一个树,大小为 \(n\). 考虑树上的一条路径,如果一个边的两个点都在这路径上,我们称这个边属于这个路径,如果一个边有且只有一个点在这路径上,我们称这个边 ...