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