01 | Docker | 基本使用

01 | Docker | 基本使用

容器与虚拟机

1.对比

在这里插入图片描述

ContainerVM
启动速度秒级分钟级
运行性能接近原生5%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级系统级(更彻底)
操作系统主要支持linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统
2.优缺点
优点:
1、环境治理
2、提高服务器资源利用率
3、快速搭建新技术环境,不用学习复杂的部署环境
4、轻量级
5、虚拟化满足不了一些业务场景
6、完美构建微服务部署环境
7、一次构建,多地方部署
8、快速部署、迁移、回滚,不依赖底层环境
9、高度保持多个环境一致性
缺点:
1、安全性不如VM
2、隔离性不如VM
3、大规模不易管理,K8s应用而生
4、不易有状态应用部署
5、排查问题比较难
6、不支持Windows

Centos 7.x 安装Docker

1.配置DNS
cat >> /etc/resolv.conf <<EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF
2.配置yum源
# 同步windows时间
ntpdate time.windows.com
# 修改时区为上海
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cd /etc/yum.repos.d/
rm -rfv *
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
3.安装docker
yum install -y docker-ce
systemctl start docker
systemctl enable docker
4.基本使用
镜像是什么?
• 一个分层存储的文件
• 一个软件的环境
• 一个镜像可以创建N个容器
• 一种标准化的交付
• 一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。
我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。
Docker镜像默认存储在/var/lib/docker/\<storage-driver\>中。
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com
# 第一种:配置官方镜像加速器:
https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl restart docker

# 第二种:配置阿里云镜像加速器
登录阿里云——>阿里云镜像服务——>镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker pull nginx
docker pull centos
docker history nginx
docker images
docker save nginx > nginx.tar.gz
docker info
docker inspect image nginx
ls /var/lib/docker/overlay2/
du -sh /var/lib/docker/*

在这里插入图片描述

如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,
会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多
少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作
的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。
• 一个镜像创建多个容器
• 镜像增量式存储
• 创建的容器里面修改不会影响到镜像
机制:Copy-ON-Write
容器实现基于:
cgroups 资源限制:比如使用多少CPU/内存
namespace 资源隔离:进程隔离、文件系统、用户隔离等
ufs 联合文件系统:镜像增量式存储,提高磁盘利用率
管理镜像常用命令表

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除一个或多个镜像
prune 移除未使用的镜像。没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入
创建容器常用选项表

选项 描述
-i, –interactive 交互式
-t, –tty 分配一个伪终端
-d, –detach 运行容器到后台
-e, –env 设置环境变量
-p, –publish list 发布容器端口到主机
-P, –publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
–name string 指定容器名称
-h, –hostname 设置容器主机名
–ip string 指定容器IP,只能用于自定义网络
–network 连接容器到一个网络
–mount mount 将文件系统附加到容器
-v, –volume list 绑定挂载一个卷
–restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
选项 描述
-m,–memory 容器可以使用的最大内存量
–memory-swap 允许交换到磁盘的内存量
–memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable 禁用OOM Killer(当物理内存不足时,杀掉占用物理内存大的进程)
--cpus 可以使用的CPU数量
–cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares CPU共享(相对权重)
创建一个容器:
1、设置容器名为hello
2、暴露88端口让外部访问
3、传入一个test=123456变量
4、设置开机启动

docker run -d --name hello -e test=123456  -p 88:80 --restart=always  nginx
docker ps
docker logs hello 
docker logs hello -f
ls /var/lib/docker/containers/
docker exec -it hello bash
docker top hello
docker stats hello
# 前台运行(关闭守护进程)
nginx -g daemon off;
# 默认没有限制,可以使用宿主机所有资源
docker ps -qa
docker rm -f $(docker ps -qa)
docker run -d --name hello -e test=123456  -p 88:80 --restart=always  nginx
资源限制:内存、CPU、硬盘、网络

内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=600m" --oom-kill-disable nginx
CPU限额:
允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx
nginx压力测试:
yum -y install httpd-tools
ab -c 1000 -n 1000000 http://172.17.0.2/index.html
管理容器常用命令表

ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start/restart 停止/启动一个或多个容器
rm 删除一个或多个容器
持久化容器中应用程序的数据

Docker提供三种方式将数据从宿主机挂载到容器中:
• volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
• bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
• tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用
tmpfs,同时避免写入容器可写层提高性能。
需要持久化的数据:
1、日志,一般用于方便日志采集和故障排查
2、配置文件,比如nginx配置文件
3、业务数据,比如mysql,网站程序
4、临时缓存数据,比如nginx-proxy-cache
# 目录映射: -v 数据卷名称或者源目录:容器目标
docker volume ls
docker volume create www
docker volume inspect www
ll /var/lib/docker/volumes/www/_data
docker run -d -v www:/usr/share/nginx/html nginx
vi /var/lib/docker/volumes/www/_data/index.html
curl 172.17.0.2
docker ps
docker rm -f frosty_colden
ll /var/lib/docker/volumes/www/_data
docker run -d -v www:/usr/share/nginx/html nginx
curl 172.17.0.2(数据卷与容器是相互独立的)
# 将宿主机的一个目录挂载在容器中
docker run -d -v /tmp:/opt nginx
docker exec 9b5a44420a617aedd4c0b9bbf70adc31f9d7b8b4564c50b5ab69a7b27e60d7ed ls /opt
touch /tmp/lzx.txt

mkdir wwwroot
ls
docker run -d -v /home/wwwroot:/usr/share/nginx/html nginx
docker ps -l
cd /home/wwwroot/
ll
docker exec -it db5038d70850 bash
cd /usr/share/nginx/html/
echo lzx > index.html
exit
ll
cat index.html
bind mounts注意点:
1、宿主机文件或者目录必须存在才能成功挂载
2、宿主机文件或者目录覆盖容器中内容

在这里插入图片描述

Dockerfile 构建常见基础镜像

镜像分类:
1、基础镜像,例如centos(yum)ubuntu(apt)alpine(apk)
2、环境镜像,例如php、jdk、python
3、项目镜像,打包好的可部署镜像

制作镜像:
1、选择一个符合线上操作系统的基础镜像
2、用基础镜像创建一个容器,手动在容器里面跑一边你要部署的应用
3、确认你启动这个应用的前台运行命令
指令 描述
FROM 构建新镜像是基于哪个镜像
LABEL 标签
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
ENTRYPOINT 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效
制作nginx基础镜像:
docker run -itd --name test centos:7
docker exec -it test bash
yum install -y gcc gcc-c++ make openssl-devel pcre-devel
exit
下载nginx源码包:http://nginx.org/en/download.html
上传源码包到/home目录
cd /home
docker cp nginx-1.18.0.tar.gz test:/
tar -zxf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make -j 4(多线程编译)
make install
/usr/local/nginx/sbin/nginx
ps -ef
curl 127.0.0.1
date
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date
exit

源码安装:
0. 安装依赖包,例如gcc、make
1./configure
2、make
3、make install
FROM centos:7
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && \
make -j 4 && \
make install


编写Dockerfile的技巧:(镜像是分层的,在下一层不能控制上一层里的文件)
1、如果追求镜像更小,选择alpine
2、运行的Shell命令尽可能写到一个RUN里面,减少镜像层
3、清理部署时产生的缓存或者文件
# 编写Dockerfile
mkdir nginx
cd nginx
vi Dockerfile
mv ../nginx-1.18.0.tar.gz ./
vi Dockerfile

样例:
FROM centos:7
LABEL maintainer bear
RUN yum install -y gcc gcc-c++ make \
    openssl-devel pcre-devel gd-devel \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*

COPY nginx-1.18.0.tar.gz /
RUN tar zxf nginx-1.18.0.tar.gz && \
    cd nginx-1.18.0 && \
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module && \
    make -j 4 && make install && \
    rm -rf /usr/local/nginx/html/* && \
    echo "ok" >> /usr/local/nginx/html/status.html && \
    cd / && rm -rf nginx* && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]



docker build -t nginx:v1 .
docker ps
docker images
docker run -d -p 81:80 nginx
docker ps -l
docker run -d -p 82:80 nginx:v1
docker ps -l
docker logs 968809abb47f
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值