docker 系列

一. docker 定义

1 nameSpnce 命名空间

 NameSpace(命名空间)主要包含以下六种技术:
 
#01 MNT Namespace(提供磁盘挂载点和文件系统的隔离能力):
      每个容器都要有独立的根文件系统用户空间,以实现在容器里面启动服务并且使用容器的运行环境。换句话说,就是在容器里面不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指的运行目录里面。
      举个例子:
     一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境。
    
#02 IPC Namespace(提供进程间通信的隔离能力):
      一个容器内的进程间通信,允许一个容器内的不同进程的(内存,缓存等)数据访问,但是不能跨容器访问其他容器的数据 。
    
#03 UTS Namespace(提供主机名隔离能力):
      用于系统标识,其中包含了hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的他容器 。
    
#03 PID Namespace(提供进程隔离能力):
      CentOS Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父。
      在每个容器内也要有一个父进程来管理其下属的子进程,多个容器进程的PID namespace进程隔离(比如PID编号重复、容器内的主进程与回收子进程等)。
    
    
#04 Net Namespace(提供网络隔离能力):
      每一个容器都类似于虚拟机一样有自己的网卡,监听端口,TCP/IP协议栈等。
      以Docker为例,使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0。
      上面提到的docker0本质上是Linux的虚拟网桥(Virtual Bridge),网桥是在OSI七层模型的数据链路网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
    
    
#05 User Namespace(提供用户隔离能力):
      各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎隔离各个容器内的用户空间呢? #06 User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会用户的作用范围限制在每个容器内。
      即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离,互不影响,永不相见。

2 cgroup 控制组

  • 资源限制
Cgroups:
    一个容器如果不对其做任何资源限制,则宿主机(也称为物理机,英文名称为:"Physical machine")会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完。
    综上所述,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU,内存,磁盘等。
    Linux Cgroups的全称是Linux Control Groups,它最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等等。

3 为什么使用容器

#使用容器有很多好处,以下是比较容器可圈可点的特性:
(1)可移植性:
用容器开发的应用拥有运行所需的一切,并可以部署在包括私有云和公共云在内的多种环境中。
可移植性也意味着灵活性,因为您可以更轻松地在环境和提供商之间移动工作负载。
(2)可扩展性:
容器具有水平扩展的功能,这意味着用户可以在同一集群中成倍增加相同容器的数量,从而根据需要进行扩展。
通过仅在需要时使用和运行所需的内容,可以大大降低成本。
(3)高效性:
容器所需的资源要少于虚拟机(VM),因为它们不需要虚拟单独的操作系统。
您可以在单个服务器上运行多个容器,而且它们需要较少的裸机硬件,这意味着成本更低。
(4)更高的安全性:
容器之间彼此隔离,这意味着在一个容器遭到破坏的情况下,其他容器并不会受到影响。
(5)速度:
由于容器相对于操作系统具有自主性,因此其启动和停止仅需几秒钟的时间。这也加

二. docker 安装


一、部署docker环境
1.关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld 2.停用并禁用selinux
getenforce
setenforce 0 3.下载阿里云的软件源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 4.配置docker-ce的软件源(也称为"存储库")
yum -y install yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 5.安装Docker Engine和容器
yum -y install docker-ce docker-ce-cli containerd.io 6.启动docker守护进程并设置开机自启动
systemctl start docker
systemctl enable docker 7.修改docker engine的默认Registry,建议使用国内的镜像仓库,国外的源网络会延迟较大
cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
} systemctl daemon-reload
systemctl restart docker 8.dockers命令自动补全
yum -y install bash-completion source /usr/share/bash-completion/bash_completion

三 .docker 初步使用命令

3.1 镜像相关

  • 基本语法
[root@mysql02 ~]# docker image

Usage:  docker image COMMAND

Manage images

Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Download an image from a registry
push Upload an image to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  • 简单使用
#01 检查docker版本信息
docker info
docker version #02 查看本地镜像
docker image ls
docker images #简写 #03 查询下载镜像名称 + 包名称
docker search nginx #04 拉取镜像
docker image pull nginx:latest #05 给镜像设置标签
docker tag nginx:latest nginx:v2 解释下:
docker tag 镜像修改前名称 镜像修改后名称 #06 删除镜像
docker image rm nginx:v2 #07 清除所有未使用的镜像
docker image prune -a #08 打包镜像并导入
1)拉取镜像
docker pull alpine #拉取镜像
docker tag alpine:latest alpine:v1 #打标签 2)开始打包
docker image save -o alpine-v1.tar.gz alpine:v1 #方式一
docker image save alpine:v1 >alpine-v2.tar.gz #方式二 3)导入镜像
docker image load -i alpine-v1.tar.gz #方式一
docker image load < alpine-v2.tar.gz #方式二 #09 查看镜像历史构建命令
docker image history 镜像id #10 查看镜像元数据
docker image inspect 镜像id

3.2 容器相关

  • 基本语法
[root@mysql02 ~]# docker container 

Usage:  docker container COMMAND

Manage containers

Commands:
cp Copy files/folders between a container and the local filesystem
create Create a new container
exec Execute a command in a running container
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Create and run a new container from an image
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
  • 初步使用
#01 创建容器 alpine
docker create alpine:v1 #02 启动容器 (如果没有进程运行 则容器的生命周期结束)
docker start 6bb70406e75 #03 运行并容器
docker run -it -d alpine:v1 #04 查看容器
docker ps #查看存活的容器
docker ps -a #查看所有容器 #05 管理启动重启容器
docker start
docker stop
docker restart #06 重命名
docker rename vibrant_keller bb #修改名称为 bb #07 检查日志
docker logs -f brave_mcnulty #08 进入容器
docker exec -it brave_mcnulty bash #09 文件传输
docker cp zhangbinbing.sql brave_mcnulty:/ #复制文件到容器内
docker cp brave_mcnulty:/zhangbinbing.sql ./ #容器内文件到宿主机

3.3 第一个项目

##项目要求:使用Centos7镜像编译安装 nginx:1.18.0 加入 echo 模块 并启动;

#01 拉取镜像 并启动
docker pull centos:7
docker run -it centos:7 bash #02 进入容器 配置基础环境
1)更换yum源为阿里云
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup ; curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo ;sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo 2)下载编译安装所需要的依赖包
yum -y install iproute vim lrzsz tree git screen psmisc lsof tcpdump wget ntpdate gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2 libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed 3) 优化镜像大小
rm -rf /var/cache/yum/* 4) 保存基础镜像
docker container commit -a 'zhang' relaxed_almeida centos7:v1 #03 编译nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xf nginx-1.18.0.tar.gz #下载echo 模块
git clone https://github.com/openresty/echo-nginx-module.git #开始编译
mkdir /zhang && useradd -s /sbin/nologin -u 2000 zhang
cd nginx-1.18.0/
./configure --prefix=/zhang/nginx \
--user=zhang \
--group=zhang \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/echo-nginx-module echo $? #回复0代表成功
make -j 2 && make install
echo $? #回复0代表成功 #04 给权限 并配置环境变量
chown zhang.zhang -R /zhang/
vim /etc/profile.d/nginx.sh
#!/bin/bas
export NGINX_HOME=/zhang/nginx
export PATH=$PATH:$NGINX_HOME/sbin source /etc/profile.d/nginx.sh #刷新 #05 编辑nginx 配置文件
vim /zhang/nginx/conf/nginx.conf
server {
listen 80; location /hello {
default_type text/html;
echo "<h1 style='color: green'>Welcome to zhangyuzhouedu linux76</h1>";
echo "<h1 style='color: red'>Nginx-Server-Name: $hostname</h1>";
echo "<h1>Nginx-Server-IP: $server_addr</h1>";
echo "<h1>Nginx-Server-Version: $nginx_version</h1>";
}
} #06 添加IP转发(容器内)
echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
sysctl -p #07 书写启动nginx 脚本
[root@436eca2d4c74 nginx-1.18.0]# cat /nginx.sh
#!/bin/bash
/zhang/nginx/sbin/nginx -g 'daemon off;' chmod +x /nginx.sh #08 保存成镜像
docker container commit -a 'zhang' relaxed_almeida centos7-nginx1-8:v2 #09 启动服务
docker container run -it -d -p 8088:80 centos7-nginx1-8:v2 sh /nginx.sh #10 访问测试
[root@mysql ~]# curl 10.0.0.101:8088/hello
<h1 style='color: green'>Welcome to zhangyuzhouedu linux76</h1>
<h1 style='color: red'>Nginx-Server-Name: 3d25487aaae9</h1>
<h1>Nginx-Server-IP: 172.17.0.2</h1>
<h1>Nginx-Server-Version: 1.18.0</h1>
  • 访问

![image-20230908223542930](docker 系列.assets/image-20230908223542930.png)

3.4 存储卷挂载

  • 概念
01 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。

#02 默认情况下,容器在宿主机存储的数据会随着容器的生命周期而消亡
1) 宿主机和容器的文件 绑定
2) 数据持久化 解释下:删除,创建 存储卷的内容 相当于删除了容器内的内容 反之一样
  • 使用
#环境配置
[root@61b88c2cdcf6 /]# mkdir /code
[root@61b88c2cdcf6 /]# echo 123 >/code/index.html
[root@61b88c2cdcf6 /]# chown zhang.zhang -R /code/ server {
listen 80;
location / {
root /code;
index index.html index.htm; }
location /hello {
default_type text/html;
echo "<h1 style='color: green'>Welcome to zhangyuzhouedu linux76</h1>";
echo "<h1 style='color: red'>Nginx-Server-Name: $hostname</h1>";
echo "<h1>Nginx-Server-IP: $server_addr</h1>";
echo "<h1>Nginx-Server-Version: $nginx_version</h1>";
}
} #打包镜像
docker container commit -a 'zhang' magical_wright centos7-nginx1-8:v3 #01 挂载nginx 配置文件和站点目录
/zhang/nginx/conf/ 配置文件目录
/code/ 站点目录 #02 创建宿主机 挂载目录
#启动容器 把配置文件复制到宿主机
mkdir /opt/docker-nginx/ -p
docker run -it -d centos7-nginx1-8:v3 bash
docker cp admiring_lalande:/zhang/nginx/conf /opt/docker-nginx/
docker cp admiring_lalande:/code/ /opt/docker-nginx/ docker container run -it -d \
-p 3306:80 \
-v /opt/docker-nginx/conf:/zhang/nginx/conf/ \
-v /opt/docker-nginx/code/:/code/ \
centos7-nginx1-8:v3 \
sh /nginx.sh

四. dockerfile编写

4.1 基础语法

###dockerfile 基础命令
FROM 指定基础镜像 ;如果是自制镜像 scratch
LABEL  标签
WORKDIR 指定工作目录
RUN   容器里运行的命令
COPY 复制 支持创建目录和重名
APP 复制 并自动解压 只支持tar包
ENV   设置环境变量
EXPOSE 设置暴露的端口
CMD 启动容器的命令

4.2 简单使用

  • 案例一
##编写 nginx 基础镜像

#制作启动nginx dockerfile

#01 创建dockerfile目录
[root@docker01 ~]# mkdir -p /docker/dockerfile/nginx
[root@docker01 ~]# cd /docker/dockerfile/nginx/ #02 书写dockerfile
[root@docker01 nginx]# cat dockerfile
# 指定使用基础镜像
FROM centos:7 #运行的命令
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &&\
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &&\
yum install -y nginx &&\
rm -fr /var/cache/yum &&\
rm -rf /usr/share/nginx/html/ &&\
mkdir -p /usr/share/nginx/html/ &&\
echo `hostname -I` >/usr/share/nginx/html/index.html
# 启动容器的命令
CMD ["nginx","-g","daemon off;"] #03 build 镜像
docker build -t nginx:v12 . #04 启动该镜像并检查
[root@mysql nginx]# docker run -it --name=nginx01 -d -p 8088:80 nginx:v12
fb16ec2f6becee95b22fa666ad20c385241093e4e2343fcb425adc181f7b3973
[root@mysql nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb16ec2f6bec nginx:v12 "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp nginx01
[root@mysql nginx]# curl 127.0.0.1:8088
172.17.0.4
  • 案例二
##编辑nginx 并指定工作目录 暴漏端口 并把站点目录复制过去

#01 编写dockerfile
# 指定使用基础镜像
FROM centos:7 #运行的命令
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &&\
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &&\
yum install -y nginx &&\
rm -fr /var/cache/yum &&\
rm -rf /usr/share/nginx/html/ &&\
mkdir -p /usr/share/nginx/html/ EXPOSE 80/tcp 80/udp WORKDIR /usr/share/nginx/html/ ADD *.tar.gz ./
# 启动容器的命令
CMD ["nginx","-g","daemon off;"] #02 准备站点目录
vim index.html
tar zcf index.html.tar.gz index.html #03 构建镜像 并启动测试
docker build -t nginx-12:v1 .
docker run -it -d --name=nginx02 -p 3306:80 nginx-12:v1

docker 系列的更多相关文章

  1. 8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍

    docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多 公司保守起见或不到万不得已基本上不会去变更现有模式. ...

  2. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  3. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  4. Docker系列10—容器编排工具Docker Compose详解

    本文收录在容器技术学习系列文章总目录 1.Docker Compose 概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置 ...

  5. docker系列 参考文章

    Docker 系列一(概念原理和安装) Docker 系列二(操作镜像) Docker 系列三(容器管理) 持续更新... ubuntu 安装docker 参考文章 :(https://blog.cs ...

  6. docker系列(五):网络通信

    1 引言 之前的几篇docker系列博客说的都是单个容器或者镜像的操作.但容器,作为一种简化的操作系统,又怎能不与机器或者容器相互协同工作呢,这就需要用到容器的网络功能.docker中提供了多种不同的 ...

  7. Docker 容器基本操作[Docker 系列-2]

    ​Docker 入门及安装[Docker 系列-1] 镜像就像是一个安装程序,而容器则是程序运行时的一个状态. 查看容器 查看容器 启动 docker 后,使用 docker ps 命令可以查看当前正 ...

  8. Docker 容器高级操作[Docker 系列-3]

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 上篇文章向读者介绍了一个 Nginx 的例子,对于 Nginx 这样一个容器而言,当它启动成功后,我们 ...

  9. Docker系列开篇之Virtual Machine VS Container(一)

    前言 本节开始我们正式进入Docker系列,网上关于Docker相关文章如数家珍,写博客至今,我也一直在朝着如何写出通俗易懂且不枯燥的文章这个目标前进,喃喃自语的同时也希望看到文章的童鞋能明白我在讲什 ...

  10. Docker系列之常用命令操作手册

    目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...

随机推荐

  1. 验证码识别服务2Captcha框架

    2Captcha是一个自动验证码识别服务,主要用于解决各种互联网服务中的验证码问题.在许多网站注册账户或进行敏感操作时,为了验证用户是真实的而不是自动化程序,会出现验证码.用户必须正确输入验证码,才能 ...

  2. MySQL拓展知识

    一:视图 1:创建视图 1 --格式:CREATE VIEW 视图名称 AS SQL语句 2 CREATE VIEW v1 AS 3 SELET nid, 4 name 5 FROM 6 A 7 WH ...

  3. 苹果打破12年惯例:iPad一整年未更新

    1月2日消息,据媒体报道,自2010年首次亮相以来,苹果一直保持着每年至少发布一款新型号的传统. 但是在过去的2023年,苹果没有发布iPad,2023年苹果发布的唯一与iPad相关的产品是USB-C ...

  4. Typecho文章采集发布插件-免费下载

    分享一款可以自动采集网页文章,并发布到typecho博客网站的typecho采集发布插件,支持简数采集器,火车头数据采集器,八爪鱼文章采集器,后羿采集器等. Typecho采集发布插件使用方法如下: ...

  5. webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式

    webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式 第一篇文章发过后,出人意料的是,收到了博客园某一位用户的狂喷[注:本系列文章会同步发布到cs ...

  6. 《ASP.NET Core 微服务实战》-- 读书笔记(第5章)

    第 5 章 创建数据服务 选择一种数据存储 由于我坚持要尽可能的跨平台,所以我决定选用 Postgres,而不用 SQL Server 以照顾 Linux 或 Mac 电脑的读者 构建 Postgre ...

  7. Linux-如何比较比较两个目录中的文件差异

    在 Linux 命令行中比较两个目录是一项常见的任务,特别是当你需要确保两个目录之间的文件完全相同时. 本文我们将介绍一些在 Linux 命令行中比较两个目录的方法. 方法一:使用 diff 命令比较 ...

  8. 古猫先生 SATA系列博文转载

    SATA专题文章列表 SATA系列专题之一:浅析Physical Layer物理层OOB信号 SATA系列专题之二:2.0 Link layer链路层概述 SATA系列专题之二: 2.1 Link l ...

  9. mysql 8.0 配置文件my.cnf中文注解【转载】

    ########################################################################### ## my.cnf for MySQL 8.0. ...

  10. 【Unity3D】场景切换、全屏_恢复切换、退出游戏、截屏

    1 前言 ​ 1)场景切换 ​ 场景切换可以使用 SceneManager 的 LoadScene 和 LoadSceneAsync 方法,如下: public static void LoadSce ...