1 什么是容器

  1. 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。
  2. 隔离的环境拥有自己的系统文件,ip地址,主机名等
  3. 容器是一种软件打包技术

程序:代码,命令
进程:正在运行的程序
容器的系统文件就是宿主机的某一个目录

2 容器和虚拟化的区别

区别:
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
容器:共用宿主机内核,第一个进程直接启动服务
优势:
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

3 容器技术的发展过程

3.1 chroot技术

新建一个子系统(拥有自己完整的系统文件)

  1. 参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
  2. 使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls)

https://linux.cn/article-8313-1.html

3.2 lxc

linux container  (namespaces:命名空间 隔离环境 及cgroups 进程资源限制)
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io

3.3 docker

4 docker容器安装

docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace:资源隔离
cgroups:进程的资源限制
配置源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
配置docker源,改为从清华源下载
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

docker-ce:社区版
docker-ee:企业版

5 docker的主要组成部分

docker是传统的CS架构分为docker client和docker server

[root@docker01 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.2
API version: 1.40
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:28:55 2019
OS/Arch: linux/amd64
Experimental: false Server: Docker Engine - Community
Engine:
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:27:34 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683

docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库存储镜像
启动容器需要镜像,仓库存储镜像

6 启动容器

docker的主要目标是“Build,Ship and Run any App,Angwhere”,构建,运输,处处运行
一次构建,处处运行

[root@docker01 ~]# docker run -d -p 80:80 nginx
# run:创建并启动一个容器
# -d: 放在后台运行
# -p: 端口映射
# nginx: 镜像名字

配置镜像加速

[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@docker01 ~]# systemctl restart docker

7 镜像命令

官方镜像仓库地址:hub.docker.com
image:镜像

[root@docker01 ~]# docker image
build import load prune push save
history inspect ls pull rm tag
====================================================================================
docker search tomcat # 搜索镜像 优先选择官方镜像,stars(星星)数量多的
docker pull alpine # 获取alpine最新版
docker pull alpine:3.9 # 指定获取alpine版本
docker push alpine # 上传镜像到仓库
# 官方pull: docker pull centos:6.8(没有指定版本,默认会下载最新版)
# 私有仓库pull: docker pull daocloud.io/huangzhichong/alpine-cn:latest
# daocloud.io:域名 huangzhichong:用户名 docker image ls # 查看镜像列表
docker images # 查看镜像列表
docker image rm alpine:3.9 # 删除镜像 可以写镜像ID号
docker rmi alpine:3.9 # 删除镜像
docker image save nginx:latest -o docker_nginx.tar.gz # 导出镜像
docker image load -i docker_alpine3.9.tar.gz # 导入镜像
docker image import docker_alpine3.9.tar.gz # 导入镜像,导入镜像没有名字
docker image inspect docker_alpine3.9.tar.gz # 查看镜像属性
docker image built -t # 构建镜像
docker image history # 构建镜像历史
docker image prune # 清楚镜像缓存

8 容器命令

docker run -d -p 80:80 nginx
# run:创建并启动一个容器
# -d: 放在后台运行
# -p: 端口映射
# nginx: 镜像名字
# -v: 源地址(宿主机):目标地址(容器) docker restart infallible_hodgkin # 重启容器 可以写容器名字或者容器ID
docker start infallible_hodgkin # 启动容器
docker stop infallible_hodgkin # 关闭容器
docker kill infallible_hodgkin # 杀死容器
docker ps # 默认查看运行的容器
docker ps -a # 查看所有状态容器
docker ps -l # 查看最近创建的容器
docker ps -q # 只显示镜像id号
docker rm crazy_elgamal # 删除容器 可以写容器名字和ID
docker rm -f `docker ps -a -q` # 删除所有容器
docker rm `docker ps -a -q` # 只删除关闭的容器
docker container commit # 提交容器为镜像
docker container update # 容器性能进行限制
docker container update --memory 300MiB --memory-swap 3000MiB nging:latest
docker container create # 创建容器不启动
docker container export # 将容器提交为tar.gz包
docker container logs # 查看容器历史信息
docker container pause # 容器挂起
docker container unpause # 取消容器挂起
docker container cp # 将宿主机文件拷贝到容器目录
docker container diff # 对比容器有哪些改变 docker run -it --name centos6 centos:6.9 /bin/bash # 创建启动容器,并进入容器
# -it   配交互式的终端interactive tty
# --name 指定容器的名字
# /bin/bash 覆盖容器的初始命令 # 进入正在运行的容器的命令
方法1:
格式:docker exec [OPTIONS] CONTAINER COMMAND
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
例子:docker container exec -it centos6 /bin/bash 方法2:格式:docker attach [OPTIONS] CONTAINER
例子:docker attach 4bcf2984f4e7
ctrl+p,ctrl+q 退出

总结:
docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
业务在容器中运行:初始命令,夯住,启动服务
nginx服务初始命令夯住:nginx -g 'daemon off;'
zabbix服务初始命令夯住:/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf

9 容器的网络访问(端口映射)

指定映射(docker 会自动添加一条iptables规则来实现端口映射)

命令格式:
-p hostPort:containerPort
-p ip:hostPort:containerPort 多个容器都想使用8080端口
-p ip::containerPort(随机端口)
-p hostPort:containerPort/udp
-p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 81:80 –p 443:443 可以指定多个-p
随机映射:docker run -P(大P) (随机端口)
# hostPort:宿主机端口 containerPort:容器端口 命令示范:
docker run -d -p 80:80 nginx:latest docker run -d -p 10.0.0.11:81:80 nginx:latest #多个容器都想使用81端口,改变IP地址即可实现
docker run -d -p 10.0.0.12:81:80 nginx:latest #多个容器都想使用81端口,改变IP地址即可实现 docker run -d -p 10.0.0.11::80 nginx:latest #宿主机随机选用端口 docker run -d -p 10.0.0.11::80/udp nginx:latest # 更换udp协议,还能再用80端口 docker run -d -p 10.0.0.11:80:80 -p 443:443 nginx:latest #指定端口映射

10 docker的数据卷管理

数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会将容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器
-–volumes-from(跟某一个已经存在的容器挂载相同的卷)

数据卷命令
[root@docker01 ~]# docker volume
create inspect ls prune rm
===================================================================================== docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
# xiaoniao:站点目录 docker run -d -p 81:80 -v xiaoniao:/usr/share/nginx/html nginx:latest
# xiaoniao为数据卷:在宿主机上 目录:/var/lib/docker/volumes/xiaoniao/_data/
# 数据卷没有会自动创建 docker run -d -p 84:80 --volumes-from busy_greider nginx:latest
# 跟某一个已经存在的容器挂载相同的卷

练习题:
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
方法一

[root@docker01 _data]# docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest
194068a14505104e1886aac31bceed5fc631dd1c1e514f97d5cf38dfdc91532d [root@docker01 _data]# docker exec -it adoring_roentgen /bin/bash root@194068a14505:/# ls /opt/
2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip root@194068a14505:/# cd /etc/nginx/conf.d/
root@194068a14505:/etc/nginx/conf.d# ls
default.conf root@194068a14505:/etc/nginx/conf.d# echo 'server {
> listen 81;
> server_name localhost;
> location / {
> root /opt;
> index index.html index.htm;
> }
> }' >xiaoniao.conf
root@194068a14505:/etc/nginx/conf.d# exit
exit
[root@docker01 _data]# docker restart adoring_roentgen
adoring_roentgen

方法二:

[root@docker01 opt]# echo 'server {
> listen 81;
> server_name localhost;
> location / {
> root /opt;
> index index.html index.htm;
> }
> }' >xiaoniao.conf [root@docker01 opt]# ls
containerd xiaoniao xiaoniao.conf
[root@docker01 opt]# docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/opt nginx:latest
ad5180b890ed044d705ed240ed1845a6bbe2d6d86724676b0cc8d302daaa9f44

docker初解的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

随机推荐

  1. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  2. [JZOJ5863] 【NOIP2018模拟9.11】移动光标

    Description

  3. Netty - 粘包和半包(上)

    在网络传输中,粘包和半包应该是最常出现的问题,作为 Java 中最常使用的 NIO 网络框架 Netty,它又是如何解决的呢?今天就让我们来看看. 定义 TCP 传输中,客户端发送数据,实际是把数据写 ...

  4. Centos 7 集成安装Apache+PHP+Kerberos+LDAP+phpLDAPadmin

    一.安装Apache 1.1.安装Apache Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速.可靠.简单的API扩展. 它的名字取自美国印第安人土 ...

  5. Halcon一日一练:图像设备介绍

    Halcon在设计之初就提供了完整的图像采集方案,适应了多种图像设备采集图像,以及各种不同环境的采集方案. 通常情况下,图像的采集应该是所有机器视觉项目首要解决的任务,不幸的是,需要解决图像采集的问题 ...

  6. golang会取代php吗

    看看PHP和Golang如何在开发速度,性能,安全性,可伸缩性等方面展开合作. PHP与Golang比较是一个艰难的比较. PHP最初创建于1994年,已有24年.自那时起,由于PHP的开源格式,易用 ...

  7. jmeter-控制业务比例

    方式一: 多线程组 缺点:由于各事务相应时间一般不一致,故只能粗略的控制业务占比 实例:待补充

  8. 20.discuz论坛-实现伪静态

    部署discuz论坛 1.直接上配置文件--->>> [root@web01 conf.d]# vim discuz.cheng.com.conf server { listen 8 ...

  9. 三维动画形变算法(Mixed Finite Elements)

    混合有限元方法通入引入辅助变量后可以将高阶微分问题变成一系列低阶微分问题的组合.在三维网格形变问题中,我们考虑如下泛函极值问题: 其中u: Ω0 → R3是变形体的空间坐标,上述泛函极值问题对应的欧拉 ...

  10. 算法随笔-二叉树遍历的N种姿势

    最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...