docker

    技术2022-08-16  90

    1.什么是容器?

    容器是由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并在宿主机(Host)操作系统的用户空间中运行,但与操作系统的其他进程相互隔离.即:容器就是在隔离的环境运行的一个进程

    docker 的优点

    1.缩减部署过程及可移植性 2.环境标准化 3.软件升级及版本控制 4.隔离性

    2.docker 需要隔离的6种名称空间(namespace)

    1.UTS主机和域名 2.Mount挂载点(文件系统) 3.IPC信号量\消息队列和共享内容 4.PID进程编号 5.User用户和用户组 6.Net网络设备\网络栈\端口号等

    3.docker-ce 的安装

    第一步:下载 docker-ce

    cd /etc/yum.repos.d/ wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo vim docker-ce.repo :%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@ yum install -y docker-ce

    第二步:配置加速器

    mkdir /etc/docker vim /etc/docker/daemon.json { "registry-mirrors": ["https://765v3tj7.mirror.aliyuncs.com"] }

    第三步:启动 docker 程序

    systemctl restart docker.service systemctl enable docker.service

    验证

    docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:25:41 2019 OS/Arch: linux/amd64 Experimental: false

    4.docker 镜像常用命令

    docker search 搜索镜像,优先选官方,stars数量多 docker pull 拉取镜像(下载镜像),注意版本 docker push 推送镜像(上传镜像) docker load 导入镜像 例子: docker load -i docker_nginx.tar.gz docker save 导出镜像 例子:docker save centos:7 -o docker_centos7.tar.gz docker image ls 查看镜像列表 docker rmi 删除镜像 docker tag 给镜像打标签

    5.docker 容器常用命令

    docker run 创建并启动容器 例子:docker run -d -it -p 80:80 nginx:latest docker create 创建容器 --name docker start 启动容器 docker stop 停止容器 docker restart 重启容器 docker kill 强制停止容器 docker ps 查看容器列表 -a 查看所有容器 docker rm 删除容器 批量删除所有容器: docker rm -f `docker ps -a -q` docker exec 进入正在运行的容器(分配一个新终端) 例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh) docker attach 进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q docker commit 从容器创建一个新的镜像 例子: docker commit 容器id 镜像名字:版本

    注意:

    容器想要放在后台一直运行的化,那么容器的初始命令,必须前台运行,否则容器就会退出.

    6.docker 端口映射

    docker run -p 宿主机端口:容器端口 -p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口) -p 宿主机ip1::容器端口 随机端口映射 -p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射 -p 80:80 -p 3306:3306 -p 1111-1119:1111-1119 端口范围映射 -P 自动随机端口映射

    7.docker 数据卷

    docker run -v 宿主机绝对目录:容器目录 -v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据 -v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据 --volumes-from 跟某一个容器挂载所有相同的卷

    8.练习: 只启动一个 nginx 容器

    方法一:

    docker run -d -p 80-81:80-81 -v /test:/test nginx:latest dodck ps -a docker exec -it vigorous_nobel /bin/bash echo ' server{ listen 81; server_name localhost; location / { root /test; index index.html index.htm; } }' > /etc/nginx/conf.d/test.conf exec docker restart vigorous_nobel

    方法二:

    docker run -d -p 82-83:80-81 -v /test:/test nginx:latest vim test.conf server{ listen 81; server_name localhost; location / { root /test; index index.html index.htm; } } docker cp test.conf 1448ded327d2:/etc/nginx/conf.d docker restart condescending_colden

    方法三:

    vim test.conf server{ listen 81; server_name localhost; location / { root /test; index index.html index.htm; } } docker run -d -p 04-05:00-01 -v /test:/test -v /root/test:/etc/nginx/conf.d/test.conf nginx:latest

    9.手动制作 docker 镜像

    制作一个基于 centos6 系统的nginx镜像(单服务)

    第一步:启动一个纯净的容器,在容器中安装服务
    docker run -it -p 80:80 centos:6.9 /bin/bash curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum install -y nginx exit
    第二步:把安装好服务的容器提交为镜像
    docker commit 507fe98fc330 centos6.9_nginx:v1
    第三步:测试 docker run
    docker run -d -p 81:80 centos6.9_nginx:v1 nginx -g 'daemon off;'

    制作一个 nginx+sshd 双服务镜像

    第一步:启动一个基础环境的容器, 在容器中安装服务
    docker run -it -p 88:80 -p 1022:22 centos6.9_nginx:v1 /bin/bash yum install -y openssh-server service sshd restart echo '123456' | passwd --stdin root vi /init.sh #!/bin/bash # 启动ssh服务 /usr/sbin/sshd # 启动nginx服务 nginx -g 'daemon off;' chmod +x /init.sh exit
    第二步:把安装好服务的容器提交为镜像
    docker commit 43fc313c3caf centos6.9_nginx_ssh:v1
    第三步:测试 docker run
    docker run -d -p 90:80 -p 1024:22 centos6.9_nginx_ssh:v1 /bin/bash /init.sh

    10.dockerfile 自动制作镜像

    自动构建 docker 镜像的需要一个 dockerfile 文件, 一个镜像一个 dockfile 文件.

    常用指令

    FROM 基础镜像 RUN 制作镜像过程中需要的执行命令(安装服务) CMD 容器启动的时候执行的初始命令,容易被替换(启动服务) ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和 ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数 ADD 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包) COPY 把dockerfile当前目录下的文件拷贝到容器中(不解压tar包) WORKDIR 指定容器的默认工作目录 EXPOSE 镜像要暴露的端口 VOLUME 持久化卷 ENV 环境变量(ssh的密码,数据库的密码) LABEL 镜像的属性标签 MAINTAINER 管理者标识

    根据 dockerfile 自动构建镜像的思路

    a: 手动制作docker镜像,记录历史命令 b: 根据历史命令编写dockerfile文件 c: docker build构建docker镜像 d: 测试镜像的功能

    dockerfile 基于 centos6 系统的nginx镜像

    FROM centos:6.9 RUN echo '192.168.19.200 mirrors.aliyun.com' >>/etc/hosts RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo RUN yum install nginx -y CMD ["nginx","-g","daemon off;"] docker build -t centos_nginx:v1

    centos7安装mysql5.6

    FROM daocloud.io/library/centos:7 RUN yum install -y wget RUN groupadd -r mysql && useradd -r -g mysql mysql RUN wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm RUN rpm -ivh mysql-community-release-el7-5.noarch.rpm RUN yum install -y mysql-server RUN mkdir -p /var/lib/mysql /var/run/mysqld \ && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \ && chmod 777 /var/run/mysqld VOLUME ["/var/lib/mysql"] RUN /usr/bin/mysql_install_db USER mysql cmd ["mysqld"]

    dockerfile的优化

    a: 使用体积小的linux镜像alpine b: 尽可能的清理无用的缓存文件(尽可能把多个RUN合并) c: 修改dockerfile的时候,尽可能把修改的内容放在最后 d: 使用.dockerignore忽略构建docker镜像时,不需要的文件

    11.使用 alpine 构建 docker 镜像

    alpine 构建 nginx 镜像

    docker run -it alpine:latest /bin/sh sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories apk update apk add nginx mkdir /run/nginx nginx hostname exit docker commit ed956cd97f1b alpine_nginx:v1 docker run -d -p 88:80 alpine_nginx:v1 nginx -g 'daemon off;'
    Processed: 0.011, SQL: 9