# 官方提供@yunTaoScripts Docker 开源的应用容器引擎 🔥🔥

loading

让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。

# docker 容器运行时

高级别 运行通过调用低级别运行时实现管理容器。高级别运行时管理的镜像是可以通用的,是因为他们都遵守oci 。

OCI 是什么? 开放容器标准

OCI,Open Container Initiative,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业中的其他领导者在 2015 年 6 月的时候启动。OCI 的技术委员会成员包括 Red Hat,Microsoft,Docker,Cruise,IBM,Google,Red Hat 和 SUSE,其中 Docker 公司有两名成员,且其中的一位是现任主席,

  • 高级别runtime,能够管理容器和镜像
    • Docker
    • podman
    • containerd
    • rkt
    • cri-o
  • 低级别runtime,只能管理容器
    • runc
    • lxc
    • gvisor
    • kata

docker podman containerd 高级别默认调用 runc

# docker 安装

参见-----> 安装docker

# docker 镜像管理

默认镜像名称

docker pull nginx
dokcer pull docker.io/library/nginx:latest # 完整镜像名称
             服务器地址/分类   /  名称:版本
docker pull 镜像
docker tag 镜像
docker rmi 镜像
docker save 镜像名 > filename.tar 
docker load -i filename.tar
# 把容器导出为镜像
docker export 容器名 > filename.tar
# 导入 
cat filename.tar | docker import - 镜像名
# -a 作者信息, -m 提交信息 , id 是容器id ,最后是到处镜像名
docker commit -a "aa" -m "bb" 6a785f2adc9d test:v2 
docker history xxxx --no-trunc 可以显示完整的内容
  • Openshift 提供S2I source to image

save、export、commit的区别

命令 作用 应用场景 相同点 区别
docker export/docker import 导出容器到一个文件 迁移容器 都可以创建镜像 不带历史,基于 容器创建
docker save/docker load 导出镜像到指定文件 分享镜像 都可以创建镜像 带历史,基于镜 像创建
docker commit 基于容器创建镜像 创建新的镜像 都可以创建镜像 保存历史合并新 层,,基于容器创 建

# docker 容器管理

  • 运行容器
docker run镜像 ---最简单的一个容器
docker run -it --rm hub.c.163.com/library/centos /bin/bash
docker run -dit -h node --name=c1 镜像名 命令
docker run -dit --restart=always 镜像名 命令
docker run -dit --restart=always -e 变量1=值1 -e 变量2=值2 镜像                  
  • 管理容器的常见命令
docker exec xxxx 命令
docker start xxxx
docker port xxxx # 查看映射端口
docker stop xxxxx
docker restart xxxxx 
docker top xxxxx
docker logs -f node
docker inspect 容器

# docker 数据卷管理

docker run -dit --restart=always -v p_path1:c_path2 镜像名 命令 

docker run -dit --restart=always -v c_path2 镜像名 命令
  • 文件夹只读
docker run -dit --restart=always -v p_path1:c_path2:rw 镜像名 命令 
docker run -dit --restart=always -v p_path1:c_path2:ro 镜像名 命令 

路径写法说明

  • -v 只写一个路径,默认指容器路径,映射路径是随机物理机路径。
  • -v 写两个路径,第一个是物理机路径,第二个是容器路径。

# docker 自定义镜像

yum install epel-release

# 书写Dockerfile

FROM centos:centos7.9.2009
MAINTAINER yuntao
RUN rm -rf /etc/yum.repos.d/*
ADD repo.tar /etc/yum.repos.d/
RUN rm -f /etc/yum.repos.d/docker-ce.repo  /etc/yum.repos.d/kubernetes.repo
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-*
RUN yum install epel-release -y
RUN yum install -y nginx
EXPOSE 80
CMD ["nginx", "-g","daemon off;"]

COPY 和 ADD的区别

  • COPY和ADD的意思是一样
  • ADD带有自动解压功能 COPY没有自动解压功能

# 优化 Dockerfile

>> 请看这里 👆🏻<<

# 通过 Dockefile 创建镜像

docker build -t v4 . -f filename
docker build -t v4  .

# 创建可以ssh的centos镜像

FROM centos:v1
MAINTAINER duan
RUN rm -rf /etc/yum.repos.d/*
ADD epel.repo /etc/yum.repos.d/
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum install openssh-clients openssh-server -y
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key RUN 
sed -i '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
RUN echo "root:redhat" | chpasswd 
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

# docker 网络管理

docker network list
docker network inspect 6f70229c85f0
docker network list
man -k docker
man docker-network-create
docker run --network host --rm -it centos /bin/bash # 使用宿主机网络空间
docker network create -d bridge --subnet=10.0.0.0/24 mynet
docker run --net=mynet --rm -it centos /bin/bash
docker run -dit -p 物理机端口:容器端口 镜像

# 容器互联

参考文章 (opens new window)

# 先创建一个容器
docker run -it --rm --name=h1 hub.c.163.com/library/centos

再创建一个容器h2,和h1通信有两种方式
docker inspect h1 | grep -i ipaddr
• docker run -it --rm --name=h2 centos ping 172.17.0.2
• docker run -it --rm --name=h2 --link h1:h1 centos ping h1

# lab-搭建一个wordpress博客

docker run -dit --name db --restart=always -e MYSQL_ROOT_PASSWORD=redhat -e MYSQL_DATABASE=wordpress mysql
docker run -dit --name blog --restart=always -e WORDPRESS_DB_HOST=172.17.0.2 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=redhat -e WORDPRESS_DB_NAME=wordpress -p 80:80 wordpress

docker run -dit--name blog --link=db:mysql -p 80:80 wordpress

# 配置docker本地仓库

docker pull registry
docker run -d --name registry -p 5000:5000 --restart=always -v /myreg:/var/lib/registry registry
docker login http://harbor.yuntao.work:300 -u xxxxx

# docker使用本地仓库

cat /etc/docker/daemon.json {
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.26.70:5000"] 
}
curl http://10.211.55.111:5000/v2/_catalog
docker push 192.168.26.70:5000/rhce/busybox
docker pull 192.168.26.70:5000/rhce/busybox 或者
curl -XGET http://192.168.26.70:5000/v2/_catalog
curl -XGET http://192.168.26.70:5000/v2/rhce/nginx/tags/list

# 对容器内存的限制

docker run -it --rm --name=yuntao -m 1g centos:centos7.9.2009  bash

# 对容器CPU的限制

# 限制cpu 跑在哪个核心上
docker run -it --rm --name=yuntao --cpuset-cpus=0  centos:centos7.9.2009  bash
cat /dev/zero > /dev/null
# 查看 运行在哪个核心
ps mo pid,comm,psr