首页 > 其他分享 >docker 系列

docker 系列

时间:2023-11-13 11:46:39浏览次数:24  
标签:容器 系列 repo nginx yum 镜像 docker

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 




标签:容器,系列,repo,nginx,yum,镜像,docker
From: https://www.cnblogs.com/saas-open/p/17828780.html

相关文章

  • 天穹-gateway网关系列1:Tesla网关整体介绍
    一、背景在微服务时代,服务拆分粒度越来越细,每个微服务各自负责自己的核心功能并对外提供一系列的api接口。但随着业务的拓展,接口越来越多,也就诞生了一些问题。可以在一个地方去统一的管理这些接口吗?在涉及到鉴权这个普遍的问题时,难道需要每个微服务都实现一次吗?每个微服务都有自己......
  • 天穹-gateway网关系列1:Tesla网关整体介绍
    一、背景在微服务时代,服务拆分粒度越来越细,每个微服务各自负责自己的核心功能并对外提供一系列的api接口。但随着业务的拓展,接口越来越多,也就诞生了一些问题。可以在一个地方去统一的管理这些接口吗?在涉及到鉴权这个普遍的问题时,难道需要每个微服务都实现一次吗?每个微服务都有自己......
  • mac m系列安装frida
    1.到pypi找到支持arm64的egg(这里以python3.8,frida-15.1.27举例).https://files.pythonhosted.org/packages/82/80/c3479f69267697f9391bde1515ef7f97a57ca15198e34fc146805cff0ac1/frida-15.1.27-py3.8-macosx-11.0-arm64.egg2.安装egg  easy_install-3.8frida-15.1......
  • docker Nginx ssl 配置
     nginx版本:1.21.1证书获取阿里云:_xxxx.xxxxx.com.pem、_xxxx.xxxxx.key域名:xxxx.xxxxx.com一、ssl 443端口二、非443端口 nginx.confserver{#监听端口,切记,12000后面必须加ssllisten12000ssl;#域名server_namexxxx.x......
  • macOS 通过 docker 安装 redis 集群
    安装集群macOS通过docker来进行安装redis机群,解决开发环境临时使用的问题,完成本地redis集群环境搭建。安装步骤如下:查询主机ip信息,命令如下:ifconfig删除容器信息,如果步骤执行错误了,可以删除容器,然后重新执行第3步dockerrm-fredis-30001dockerrm-fredis-30002doc......
  • 使用Dockerfile构建镜像
    一、前言场景需求:例如运行一个nginx容器,容器起来后,通常不会运行在默认配置下,那因此,我们通常需要去改一改它的配置文件或者定义模块化配置文件,然后启动服务。那为什么,nginx的默认配置不符合我们的需要呢?很显然,不同的生产场景所需要用到的配置参数各个相同,因此,对方只能用一个默认......
  • x86机器上运行arm64 docker
    DockerHub上可以找到各种非x86_64平台的镜像,但是在x86上直接运行会报错:panic:standard_init_linux.go:175:execuserprocesscaused“execformaterror”[recovered]在x86_64平台上缺少运行arm32v7的Python解释器所需要的“环境依赖”,值得庆幸的是在Linux上我......
  • docker 部署 rabbitmq集群
    rabbitmq集群:pull:dockerpullrabbitmq普通模式(默认):what:集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点。对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消......
  • 脚本安装docker和docker-composed
    该脚本支持centos7和centos8系统#!/bin/bash#一键安装docker-ce和docker-compose,本脚本适用于CentOS7和8functionos7_install_docker(){rpm-qa|grepdocker&>/etc/nullif[$?-ne0]thenecho"开始安装docker..."#step1:安装必要的一些系统工具......
  • Java SPI机制总结系列之万字详细图解SPI源码分析
    原创/朱季谦我在《JavaSPI机制总结系列之开发入门实例》一文当中,分享了JavaSPI的玩法,但是这只是基于表面的应用。若要明白其中的原理实现,还需深入到底层源码,分析一番。这里再重温一下SPI机制的概念:SPI,是ServiceProviderInterface的缩写,即服务提供者接口,单从字面上看,可以这......