docker初解
1 什么是容器
- 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。
- 隔离的环境拥有自己的系统文件,ip地址,主机名等
- 容器是一种软件打包技术
程序:代码,命令
进程:正在运行的程序
容器的系统文件就是宿主机的某一个目录
2 容器和虚拟化的区别
区别:
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
容器:共用宿主机内核,第一个进程直接启动服务
优势:
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
3 容器技术的发展过程
3.1 chroot技术
新建一个子系统(拥有自己完整的系统文件)
- 参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
- 使用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初解的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在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 ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
随机推荐
- Bitset改进你的程序质量
1:Bitset介绍 BitSet 是用于存储二进制位和对二进制进行操作的 Java 数据结构, 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 B ...
- Zabbix 2.2系列注入+getsehll
Zabbix 是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com Zabbix 的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻 ...
- Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?
当前时间:2019年10月24日.距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate.o ...
- 将JSON反序列化为指定的.NET类型
前言: 关于将JSON格式数据反序列化为指定的.NET类型数据常见的场景就是,关于网络请求获取请求成功的响应数据.本篇主要讲的的是如何通过使用Newtonsoft.Json中的JsonConvert. ...
- Activity 的 36 大难点,你会几个?「建议收藏」
前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏. 本文中 ...
- 使用C++代码打印数字正方形
使用C++代码打印数字正方形 作为一名初学者,最近在跟着网课学习C++程序设计基础.在学习过程中遇到了一些习题,我根据自己的理解和思路写了一些代码实现,算是对自己学习过程的一个记录,也希望可以对别人有 ...
- node.js的File模块
1.Node.js是什么? (1) Nodejs是为了开发高性能的服务器而诞生的一种技术 (2) 简单的说 Node.js 就是运行在服务端的 JavaScript,基于V8进行运行 (3) Node ...
- GCC常用参数详解
转载:http://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 ...
- reduce,map,filter 的用法
# filter用法 (对每一个数据进行筛选,满足条件的就保留)# 1,filter(功能函数,容器类型数据)# 2,过滤出来是一个地址,用list,或tuple进行包装# 3,过滤出来的是原容器类型 ...
- 为什么 Flutter 是跨平台开发的终极之选
跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...