一、Docker介绍

1、docker容器
docker是宿主机的一个进程,通过namespace实现了资源隔离,通过cgroup实现了资源限制,
通过写时复制技术(copy-on-write)实现了高效的文件操作 2、容器技术的发展过程
1) chroot技术
完整的根文件系统(FHS)标准的
2) LXC(LinuXContainer)
namespaces(命名空间): 隔离环境
cgroups: 资源的分配和监控 3、namespace介绍
UTS: 隔离主机名与域名
IPC: 隔离进程间的通信
PID: 隔离进程ID
NET: 隔离网络
MOUNT: 隔离挂载点(文件系统)
USER: 隔离用户和组(3.8内核后支持) 4、CGroup 介绍
资源限制: 对任务使用的资源总额进行限制
优先级分配: 通过分配的CPU时间片数量以及磁盘IO,带宽大小,控制了任务的优先级
资源统计: 统计系统的资源使用量,如CPU时长、内存使用量等
任务控制: 对任务执行挂起、恢复等操作 5、docker组件
镜像、容器、仓库

二、docker安装

1、yum源
http://mirrors.aliyun.com/docker-ce/linux/centos/ 2、安装docker
# yum install yum-utils device-mapper-persistent-data lvm2 #安装依赖包
# yum list docker-ce.x86_64 --showduplicates #列出所有版本
# yum install docker-ce #安装最新版本
# yum install --setopt=obsoletes=0 docker-ce-17.03.2* #安装指定版本(完整版本名) 3、启动Docker服务
# systemctl daemon-reload
# systemctl restart docker
# docker version
# docker info 4、配置国内镜像加速
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# systemctl daemon-reload
# systemctl restart docker 5、docker info命令的详解
Server:
Containers: 4 #主机运行的容器总数
Running: 1 #正在运行的容器
Paused: 0 #暂停的容器
Stopped: 3 #停止的容器
Images: 2 #镜像数
Server Version: 19.03.9 #docker版本
Storage Driver: overlay2 #存储引擎
Backing Filesystem: xfs #系统文件系统
Supports d_type: true #是否支持d_type(分层的功能)
Native Overlay Diff: true #是否支持差异数据存储
Logging Driver: json-file #日志类型
Cgroup Driver: cgroupfs #Cgroup类型
Plugins: #插件
Volume: local #卷
Network: bridge host ipvlan macvlan null overlay #支持的网络类型
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog #支持的日志类型
Swarm: inactive #是否支持Swarm
Kernel Version: 3.10.0-693.el7.x86_64 #宿主机内核版本
Operating System: CentOS Linux 7 (Core) #宿主机操作系统
OSType: linux #宿主机操作系统类型
Architecture: x86_64 #宿主机架构
CPUs: 1 #宿主机CPU数量
Total Memory: 1.938GiB #宿主机总内存
Name: docker #宿主机hosrname
ID: HRW7:I23X:RFNF:A26S:NLT7:VJRF:DUW2:FF5H:VVXF:AQFX:SEDY:F77R
Docker Root Dir: /var/lib/docker #宿主机数据目录
Debug Mode: false
Registry: https://index.docker.io/v1/ #默认仓库
Labels: #标签
Experimental: false #是否测试版
Insecure Registries: #非安全的镜像仓库
127.0.0.0/8
Registry Mirrors:
http://hub-mirror.c.163.com/
Live Restore Enabled: false

三、Docker的镜像基础管理

1、获取镜像
# docker search centos #优先选择官方,其次stars数量多的 2、下载镜像
# docker pull centos:7 #如果不指定版本,默认最新版本 3、查看镜像列表
# docker image ls
# docker images #简写
# docker image ls --no-trunc #查看详细信息 4、只看镜像ID
# docker image ls -q 5、查看镜像详细信息
# docker image inspect nginx:latest
# docker image inspect 965ea09ff2eb 6、导入导出镜像
# docker image load -i /tmp/centos7.tar #导入
# docker load </tmp/centos7.tar #简写导入
# docker image save centos:7 -o /tmp/centos7.tar #导出
# docker save centos:7 >/tmp/centos7.tar #简写导出 7、删除镜像
# docker image rm centos:latest #删除指定镜像
# docker image rm -f `docker image ls -q` #强制删除所有镜像
# docker image prune #删除未使用的映像
# docker rmi centos:7 #简写
# docker rmi -f centos7
# docker rmi $(docker images ls -q) 8、镜像打标签
# docker image tag e445ab08b2be ngx:v1

四、容器的管理

1、交互式的容器
# docker container run -it 9f #启动容器,无镜像,自动下载
# docker container ls #查看容器
# docker container run -it --name="test01" 9f #启动容器并命名
# docker container ls -a #查看所有容器
# docker container run -it --name="test02" --rm 9f #退出容器,自动删除
应用场景: 开发,测试,临时性的任务 2、守护式容器
# docker run -d --name="test03" nginx:1.14 #后台启动容器
# docker container inspect test03 #查看容器的详细信息
应用场景: 网络服务 3、容器的启动和关闭
# docker container start test01 #守护式容器的启动
# docker container stop test01
# docker container start -i test03 #交互式容器的启动
# docker container stop test03
# docker container kill test03 #杀死容器 4、容器的进入方法
# docker container attach test03
# docker container exec -it test03 /bin/bash 5、容器的网络访问
# docker container run -d -p 80:80 nginx #指定端口
# docker container run -d -p 10.0.1.205:8080:80 nginx #指定ip及端口
# docker container run -d -p 10.0.1.205::80 nginx #随机端口映射
# docker container run -d -p 80 nginx #随机端口映射
# docker container run -d -P nginx #随机端口映射
# docker container run -d -p 81:80/udp nginx #指定协议
# docker container run -d -p 82:80 -p 443:443 nginx #指定多个端口 6、容器前台和后台的运行
ctrl + p 加 ctrl + q #容器的后台运行
# docker container attach epic_meitner #将后台容器调到前台 7、容器的其他管理
# docker ps -a -q 等价于: docker container ls -a -q
# docker top ba916 等价于: docker container top ba916
# docker logs test03 #查看docker日志
# docker logs -tf --tail 10 test03 #-t(时间戳),-f(时时追踪),tail(最后几行)
# docker inspect 8da3b #查看日志文件的路径
# docker rm test03 #删除容器
# docker rm -f test03 #强制删除容器
# docker inspect test03 #查看详细信息
# docker run --restart=always -it --name=test03 nginx #随docker自动运行
# docker update --restart=always test03 #修改已创建的容器
# vim /etc/docker/daemon.json #随docker自动运行
"live-restore": true
# docker top test03 #查看容器的进程

五、docker的数据卷

1、手工交互数据
# docker container cp index.html n1:/usr/share/nginx/html/ 2、数据卷(数据持久化)
# docker container run -it -v /opt/data:/opt centos
# docker container run -it -v /opt/data:/opt:ro centos #指定挂载权限 3、数据卷容器
# docker run -it -v /opt/data:/opt --name "mydata" centos #创建挂载容器
# docker run -it --volumes-from mydata --name "test" centos #创建数据卷容器
# docker volume ls #查看数据卷
# docker volume inspect mydata #查看数据卷的详细
# docker rm -fv test #删除容器和数据卷
# docker volume prune #删除未被使用数据卷,慎用

六、docker的镜像制作

1、手动镜像制作
# docker run -it --name="centos_6.9" centos:6.9 #启动基础镜像
# yum install openssh-server -y #安装软件包
# service sshd start #启动sshd服务(第一次启动,生成秘钥和pam验证文件)
# echo '123456'|passwd --stdin root #设置root密码
# docker container commit 4229a centos_sshd:v1 #镜像制作
# docker run -d -p 33:22 centos_sshd:v1 /usr/sbin/sshd -D #启动新镜像容器 2、构建lamp平台
1) 启动基础镜像
# docker run -it --name="centos_6.9" centos:6.9
2) 安装软件
# yum install openssh-server htppd mysql-server php php-mysql
3) sshd 初始化
# service sshd start
# echo '123456'|passwd --stdin root
4) mysqld 初始化
# /etc/init.d/mysqld start
mysql> grant all on *.* to root@'%' identified by '123';
mysql> grant all on *.* to discuz@'%' identified by '123';
mysql> create database discuz charset utf8;
5) apache初始化
# /etc/init.d/httpd start
6) 创建启动脚本
# cat init.sh
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
# chmod 777 init.sh
7) 启动容器
# docker commit c3fd5 lamp:v1
# docker run -d --name="bbs" -p 80:80 -v /data/mysql:/var/lib/mysql -v /data/html:/var/www/html lamp:v1 /data/init.sh 3、制作centos7镜像(sshd)
1) 启动基础镜像并安装sshd软件
# docker run -it --name="centos7_sshd" centos:7.5
# yum install openssh-server -y
2) 初始化sshd服务
# mkdir /var/run/sshd
# echo 'UseDNS no' >> /etc/ssh/sshd_config
# sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
# echo 'root:123456' | chpasswd
# /usr/bin/ssh-keygen -A
3) 启动容器
# docker commit centos7_sshd centos7_sshd:v1
# docker container run -d --name=sshd_1 -p 222:22 centos7_sshd:v1 /usr/sbin/sshd -D 4) 启动容器的其他方法
# docker run -d --name=sshd_2 --privileged=true 98sd6 /usr/sbin/init #已特权用户创建容器
# docker run --privileged -d -p 222:22 centos7_sshd:v1 /usr/sbin/init

七、dockerfile自动构建镜像

1、dockerfile常用指令
FROM(基础镜像)
FROM centos:6.9
FROM centos@2199b8eb8390(更安全)
RUN(构建镜像过程中运行的命令)
RUN yum install openssh-server
RUN ["mysqld","--basedir=/usr/local/mysql"](非shell命令,带参数)
EXPOSE(向外暴露的端口)
EXPOSE 22
CMD(启动容器时运行的命令)
CMD ["/usr/sbin/sshd","-D"]
COPY(拷贝文件或目录,支持通配符,若复制目录,只拷贝目录下是所有,cp data/*)
COPY init.sh /tmp
ADD(类似COPY,增加自动解压tar包tar.*,支持源文件url地址,但不自动解压tar包)
ADD bbs.tar.gz /var/www/html/
ADD https://mirrors.aliyun.com/repo/Centos-7.repo /tmp
VOLUME (挂载容器目录到宿主机,不常用)
VOLUME ["/var/www/html","/data/mysql/data"]
WORKDIR(类似cd命令,不常用)
ENV(设定变量)
ENV CODEDIR /var/www/html/
ENV DATADIR /data/mysql/data
ADD bbs.tar.gz ${CODEDIR}
VOLUME ["${CODEDIR}","${DATADIR}"]
ENTRYPOINT(容器启动时执行的命令,无法被替换,当成参数,只能写一条)
ENTRYPOINT ["/bin/bash","/init.sh"]
# docker run -d 0cd2q /bin/bash #bash无法替换ENTRYPOINT
CMD ["/bin/bash","/init.sh"]
# docker run -d 0cd2q /bin/bash #bash会替换CMD执行的命令,容器不能启动 2、dockfile文件
# vim /data/dockfile(文件名必须是dockerfile或Dockerfile)
FROM centos:7.7
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm && yum -y install nginx
ADD index.html /usr/share/nginx/html/index.html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"] 3、构建dockerfile镜像
# docker image build -t "nginx:v1" /data/dockfile
在执行脚本时,每一行会创建一个临时容器,代码越少越好,若执行错误,用临时容器调试
# docker rmi $(docker image ls -a | grep "none" | awk '{print $3}') #删除所有临时容器

八、docker仓库(私有registry)

1、启动registry
# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry 2、修改配置文件
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["10.0.0.100:5000"]
}
# systemctl restart docker 3、上传到仓库
# docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1 #修改标签(格式: 仓库地址+项目名+镜像名)
# docker push 10.0.0.100:5000/oldguo/nginx:v1 #上传镜像 4、测试
# docker pull 10.0.0.100:5000/oldguo/nginx:v1 #下载私有仓库镜像 5、仓库加安全认证
1) 生成密码
# yum install httpd-tools -y
# htpasswd -Bbn test 123 > /data/pw/test_passwd
2) 启动认证的容器
# docker rm -f `docker ps -aq`
# docker run -d -p 5000:5000 -v /data/pw/:/auth/ -v /opt/registry:/var/lib/registry --name register-auth
-e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
3) 测试
# docker login 10.0.0.100:5000 #登录 6、重启docker服务,容器退出的解决办法
方法一(推荐)
# docker run --restart=always
方法二(覆盖全部容器)
# vim /etc/docker/daemon.json
{
"live-restore": true
}

九、docker仓库(图形化仓库habor)

1、安装
1) 安装docker和docker-compose
# yum install -y docker-compose
2) 下载安装包
www.googleapis.com
3) 解压
# tar xf harbor-offline-installer-v1.9.0.tgz
4) 修改配置文件
# vim harbor.cfg
hostname = 10.0.0.100
harbor_admin_password = 123456
5) 安装Harbor
# ./install.sh 2、客户端配置
# vim /etc/docker/demon.json
{
"insecure-registries": ["10.0.0.100"]
}
# systemctl restart docker 3、在habor中添加项目
项目-----新建项目-----填写项目名----权限设置公开 4、上传到habor
# docker tag centos:6.9 10.0.0.100/tom/centos:v1 #打标签(路径+镜像及版本)
# docker login 10.0.0.100
# docker push 10.0.0.100/tom/centos:v1 #上传到habor 5、登录web查看并测试
# docker pull 10.0.0.100/tom/centos:v1 #客户端下载测试

十、Docker的网络类型

1、本地网络
1) 查看支持网络类型
# docker network ls
2) 各类网络类型介绍
none: 无网络模式
bridge: NAT模式(默认模式,通过iptables)
host: 使用宿主机的IP和端口(Namespace)
container: 共享指定容器的IP和端口(Namespace)
3) 使用网络启动容器
# docker run -it --network=host centos6.9 /bin/bash 2、Docker跨主机网络(macvlan)
1) 介绍
macvlan: 网卡虚拟化多个mac地址,通过vlan技术实现跨主机通信,macvlan的地址只能人工管理,容易出现ip地址冲突
# docker rm $(docker ps -q -f status=exited) #删除停止的容器
2) 创建macvlan网络(docker01和docker02)
# docker network create --driver macvlan --subnet 10.0.1.0/24 --gateway 10.0.1.254 -o parent=eth0 macvlan_1
# ip link set eth0 promsic on #设置eth0网卡为混杂模式(ubuntu或其他版本需要)
3) 创建macvlan网络的容器(docker01)
# docker run -it --network macvlan_1 --ip=10.0.0.11 busybox /bin/bash
4) 创建macvlan网络的容器(docker02)
# docker run -it --network macvlan_1 --ip=10.0.0.12 busybox /bin/bash
5) 测试
# ping 10.0.0.12 3、Docker 跨主机访问(overlay)
1)启动 consul 服务,实现网络的统一配置管理(docker01)
# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
2) 修改配置文件(docker01)
# vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500", #consul服务端IP和端口
"cluster-advertise": "10.0.0.100:2376" #本地docker的IP和端口
}
# systemctl daemon-reload
# systemctl restart docker
3) 修改配置文件(docker02)
# vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500",
"cluster-advertise": "10.0.0.101:2376"
}
# systemctl daemon-reload
# systemctl restart docker
4) 新版本要修改
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://10.0.0.100:8500 --cluster-advertise=10.0.0.100:2376
5) 创建overlay网络(docker01执行,docker02不用执行)
# docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 overlay
6) 查看overlay网络(docker02)
# docker network ls
也可以登录web界面查看(10.0.0.100:8500)
7) 启动容器(docker01)
# docker run -it --network overlay busybox /bin/sh
8) 启动容器(docker02)
# docker run -it --network overlay busybox /bin/sh
9) 测试
# ping 172.16.0.1
# ping 172.18.0.2
# ping 172.18.0.3
备注: 每个容器有两个网卡,eth0实现容器间的通讯,eth1实现容器访问外网

十一、Docker 单机编排

1、安装
# yum install python-devel -y
# pip install docker-compose 2、编写docker-compose.yml文件
示例1:
# vim docker-compose.yml
web1: #ID
image: nginx #使用镜像
volumes: #把宿主机/opt/index1.html文件挂载到容器里
- /opt/index1.html:/usr/share/nginx/html/index.html
expose: #容器内使用端口
- 80 web2:
image: nginx
volumes:
- /opt/index2.html:/usr/share/nginx/html/index.html
expose:
- 80 haproxy:
image: haproxy
volumes:
- /opt/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
links: #依赖于web1和web2,只要这两个容器正常启动,haproxy才会启动
- web1
- web2
ports:
- "7777:1080" #端口映射,宿主机7777映射到容器1080端口
- "80:80"
示例2:
# vim docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
web_data:
3、启动和停止编排容器
# docker-compose -f docker-compose.yml up #-f指定文件,up启动
# docker-compose -d -f docker-compose.yml up #-d后台运行(生产环境加-d)
# docker-compose -f docker-compose.yml stop #停止容器,不删除
# docker-compose -f docker-compose.yml down #停止容器,并删除

学习docker(三)的更多相关文章

  1. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  2. Docker学习(三)认识Docker和常用命令

    Docker学习(三)认识Docker和常用命令 Docker体系结构 docker服务端,作为服务的提供方,核心进程 docker daemon,所有docker命令都是通过这个进程完成的 REST ...

  3. 从零开始学习 Docker

      这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...

  4. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

  5. Alibaba Nacos 学习(三):Spring Cloud Nacos Discovery - FeignClient,Nacos 服务注册与发现

    Alibaba Nacos 学习(一):Nacos介绍与安装 Alibaba Nacos 学习(二):Spring Cloud Nacos Config Alibaba Nacos 学习(三):Spr ...

  6. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  7. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  8. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  9. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  10. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

随机推荐

  1. 都在用神器,只有你还在死磕excel做分析

    一.excel数据分析工具_EXCE弱点 EXCEL一直是非常流行的个人计算机数据处理工具,它可以处理多种多样的数据,操作非常简单,支持丰富的函数.统计图表,在工作中更是非常得力的生产力工具.然而随着 ...

  2. mybatis plus框架的@TableField注解不生效问题总结

    一.问题描述 最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空 数据库表结构: CREATE TABLE `client_role` ( ` ...

  3. linux常用命令与实例小全

    转至:https://www.cnblogs.com/xieguohui/p/8296864.html  linux常用命令与实例小全 阅读目录(Content) 引言 一.安装和登录 (一)    ...

  4. 【SpringMVC从入门到精通】00-SpringMVC 简介

    笔记来源:[尚硅谷]SpringMVC教程丨一套快速上手spring mvc 目录 SpringMVC 简介 1.课程介绍 2.什么是 MVC? 3.什么是 SpringMVC? 4.SpringMV ...

  5. laravel 解决跨域问题并封装到中间件

    larav 官方手册有详细的步骤 https://learnku.com/articles/6504/laravel-cross-domain-solution 我们在用 laravel 进行开发的时 ...

  6. vue全局引入公共scss样式,子组件调用

    前提 已引用并使用scss npm install sass-loader --save-dev npm install node-sass --sava-dev 配置 在vue.config.js中 ...

  7. LGP7814题解

    lmpp 教你对着样例得到做法.jpg 题意:给定一个长度为 $ n $ 的字符串 A,要求你构造一个字符串 B,使得 A 是 B 的子序列且 A 不是 B 的子串. 首先给出无解的判断方法: if( ...

  8. 纯css做三角形图标

    以前做三角形图标一直是用图片,或者css3旋转,现在才发现原来还有这么简单的三角形 div { border: 10px solid transparent; border-bottom: 10px ...

  9. 面向服务开发(SOA)

    面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言 ...

  10. 面试官:Redis中的缓冲区了解吗

    hello 大家好,我是七淅(xī). Redis 大家肯定不陌生,但在使用层面看不到的地方,就容易被忽略.今天想和大家分享的内容是 Redis 各个缓冲区的作用.溢出的后果及优化方向. 在开始正文前 ...