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. Bitset改进你的程序质量

    1:Bitset介绍 BitSet 是用于存储二进制位和对二进制进行操作的 Java 数据结构, 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 B ...

  2. Zabbix 2.2系列注入+getsehll

    Zabbix 是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com Zabbix 的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻 ...

  3. Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?

    当前时间:2019年10月24日.距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate.o ...

  4. 将JSON反序列化为指定的.NET类型

    前言: 关于将JSON格式数据反序列化为指定的.NET类型数据常见的场景就是,关于网络请求获取请求成功的响应数据.本篇主要讲的的是如何通过使用Newtonsoft.Json中的JsonConvert. ...

  5. Activity 的 36 大难点,你会几个?「建议收藏」

    前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏. 本文中 ...

  6. 使用C++代码打印数字正方形

    使用C++代码打印数字正方形 作为一名初学者,最近在跟着网课学习C++程序设计基础.在学习过程中遇到了一些习题,我根据自己的理解和思路写了一些代码实现,算是对自己学习过程的一个记录,也希望可以对别人有 ...

  7. node.js的File模块

    1.Node.js是什么? (1) Nodejs是为了开发高性能的服务器而诞生的一种技术 (2) 简单的说 Node.js 就是运行在服务端的 JavaScript,基于V8进行运行 (3) Node ...

  8. GCC常用参数详解

    转载:http://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 ...

  9. reduce,map,filter 的用法

    # filter用法 (对每一个数据进行筛选,满足条件的就保留)# 1,filter(功能函数,容器类型数据)# 2,过滤出来是一个地址,用list,或tuple进行包装# 3,过滤出来的是原容器类型 ...

  10. 为什么 Flutter 是跨平台开发的终极之选

    跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...