docker学习笔记
为什么使用容器?
1.上线流程繁琐
开发->测试->申请资源->审批->部署->测试等环节
2.资源利用率低
普遍服务器利用率低,造成过多浪费
3.扩容/缩容不及时
业务高峰期扩容流程繁琐,上线不及时
4.服务器环境臃肿
服务器越来越臃肿,对维护、迁移带来困难
5环境不一致
docker是什么?
1.使用组广泛的开源容器引擎
2.一种操作系统级的虚拟化技术
3.依赖于linux内核特性Namespace(资源隔离)和Cgroups(资源限制)
4.一个简单的应用打包工具
docker设计目标
1.提供简单的应用程序打包工具
2.开发人员和运维人员职责逻辑分离
3.多环境保持一致性
Docke应用场景
1.应用程序打包
2.应用程序隔离
3.持续集成
3.部署微服务
4.快速搭建测试环境
5.提供PaaS产品(平台即服务)
Docker版本:
1.社区版(Community Edition,CE)
2.企业版(Enterprise Edition,EE)
支持平台:
Linux(CentOS,Debian,Fedora,Oracle,Linux,RHEL,SUSE和Ubuntu)
Mac
Windows
docker官方网站:
docs.docker.com
Docker安装
安装前建议关闭selinx和firewalld
systemctl stop firewalld #关闭防火墙
setenforce 0 #临时关闭Selinux
#永久关闭selinux
vim /etc/selinux/config
#将SELINUX=enable 改成 SELINUX=disabled
安装依赖包
yum install -y yum-utils
添加docker软件包源
#官方的:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#建议使用阿里的:
cd /etc/yum.repos.d
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker CE
想要一键安装并配置镜像加速点这:
docker安装脚本
yum install -y docker-ce
启动docker服务并设置开机启动
systemctl start docker
systemctl enable docker
docker官方安装使用方法:
https://docs.docker.com/engine/install/centos/
官方文档:
https://docs.docker.com
阿里的软件源:
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看docker版本及配置信息
docker info
镜像是什么?
1. 一个分层存储的文件,不是一个单一的文件
2. 一个软件的环境
3. 一个镜像可以创建N个容器
4. 一种标准化交付
5. 一个不包含Linux内核又精简的Linux操作系统
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors":[
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.c0m",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后重启docker服务
Systemctl restart docker
使用docker info查看就没有配置成功
Registry Mirrors:
https://registry.docker-cn.com/
https://hub-mirror.c.163.c0m/
https://docker.mirrors.ustc.edu.cn/
Live Restore Enabled: false
拉取centos:7的镜像
docker pull centos:7
#执行效果:
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
使用docker images查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 eeb6ee3f44bd 8 months ago 204MB
docker常用命令
docker version #查看docker版本
docker info #查看docker的信息
docker ps #查看运行的容器,-a查看所有容器
docker inspect 容器ID #查看容器的详细信息
docker search centos#搜索可用docker镜像
docker images #查看当前docker所有镜像
docker pull centos #下载镜像
cat centos.tar | docker import - centos6_newname
#Docker导入镜像
docker export 容器_id > cenos6.tar
#Docker导出镜像
docker run centos echo "hello word"
#在docker容器中运行hello world!
docker run centos yum install ntpdate
#在容器中安装ntpdate的程序
docker ps -l
#命令获得最后一个容器的id,
docker ps -a
#查看所有的容器。
运行docker commit 提交刚修改的容器,例如:
docker commit 2313132 centos:v1
docker run -i -t -d centos /bin/bash
#在容器里启动一个/bin/bash shell环境,可以登录进入操作,其中-t tty,表示打开一个终端的意思,-i interactive,表示可以交互输入,-d表示在后台启动,以daemon方式启动。
docker run -d centos:v1 /bin/bash
Docker stop id #关闭容器
Docker start id #启动某个容器
docker rm id #删除容器,
docker rmi images #删除镜像
docker run -d -p 80:80 -p 8022:22 centos:v2,
#解析:-p指定容器启动后docker上运行的端口映射及容器里
#运行的端口,80:80,第一个80表示docker系统上的80,第
#二个80表示docker虚拟机里面的端口。用户默认访问本机80端口,自动映射到容器里面的80端口。
docker exec -it id /bin/bash #进入容器终端
docker exec id ifconfig
#查看容器的IP地址;
Docker inspect id |grep -i ipaddr
#查看容器IP地址;
Docker exec df -h
#查看容器的磁盘分区信息;
使用docker安装nginx
#拉取nginx镜像
docker pull nginx
#查看镜像有没有拉取成功
docker images
#执行结果
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 4 months ago 141MB
redis latest 7614ae9453d1 5 months ago 113MB
centos 7 eeb6ee3f44bd 8 months ago 204MB
#启动docker容器
docker run -itd --name nginx_web -p 8080:80 nginx
#查看容器状态
docker ps
#执行结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0f0d8d16ebb nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx_1
#docker_nginx里的发布目录
/etc/share/nginx/html/index.html
#然后使用主机IP加上端口号进行访问
docker top
docker top 容器id
#查看容器进程
[root@master ~] docker top d0f
UID PID PPID C STIME TTY TIME CMD
root 3868 3849 0 02:51 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 3926 3868 0 02:51 pts/0 00:00:00 nginx: worker process
docker run 的各种参数详细信息
docker常用管理命令
docker ps常用参数
-a 查看所有容器,包含退出
-q 列出所有的容器id
清理所有容器
docker rm -f $(docker ps -qa)
Docker 容器数据持久化
Docker 提供两种方式将数据重宿主机挂载到容器中:
1.volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes).
2.bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
volumes示例
1、创建数据卷
1.docker volume create nginx-vol
2.docker volume ls
3.docker volume inspect nginx-vol
2.使用数据卷
1.docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
2.docker run -d --name=nginx-test1 -v nginx-vol:/usr/share/nginx/html nginx
bind mounts演示
mkdir /opt/wwwroot
docker run -d --name web -p 88:80 -v /opt/wwwroot:/usr/share/nginx/html nginx
#编辑网页
cd /opt/wwwroot
echo "<h1>hello word</h1>"
docker容器网络
1.veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出。用于解决网络命名空间之间隔离。
2.docker0:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同端口连接起来,并实现类似交换机那样的多对多的通信。
docker网络模型:
Docker使用iptables实现网络通信
外部访问容器:
bles -t nat -vnL DOCKER
容器访问外部:
iptables -t nat -vnL POSTROUTING
docker网络模型:
DNAT 目标网络地址转换
SNAT 源地址转换
dockerfiel
dockerfile概述
Docker通过Dockerfile自动构建镜像,
Dockerfile是一个包含用于组建镜像的
文本文件,由一条一条的指令组成
Dockerfile常用指令
FROM #构建新镜像是基于那个镜像
LABEL #标签
RUN #构建镜像时运行的shell命令
COPY #拷贝文件过目录到镜像中
ADD #解压压缩包并拷贝
ENV #设置环境变量
USER #为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE #声明容器运行的服务端口
WORKDIR #为RUN、CMD、ENTRYPOINT、COPY和ADD设置生成工作目录
CMD #运行容器是默认执行,如果有多个CMD指令,最后一个生效
构建镜像命令
# docker bulid [OPTIONS] PATH |URL| -{flags}
Options:
-t, --tag list #镜像名称
-f, --file string #指定Dockerfile文件位置
例如:
# docker build -t shykes/myapp .
# docker bulid -t shykes/myapp -f /path/Dockerfile /path
# docker bulid -t shykes/myapps http://www.example.com/Dockerfile
使用dockerfile 基于centos7构建sshd服务
#Dockerfile 配置
FROM centos:7
MAINTAINER This is centos:ssh
#安装ssh和其他服务软件包
RUN yum update -y && yum install -y openssh* net-tools lsof telnet passwd
#修改root用户密码
RUN echo "123456" | passwd --stdin root
#设置不使用ssh服务端的pam模块
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#创建非对称秘钥
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#关闭pam.d的ssh会话模块
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^ /#/' /etc/pam.d/sshd
#创建ssh工作目录并设置权限
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#暴露端口
EXPOSE 22
#开启sshd服务
CMD ["/usr/sbin/sshd","-D"]
Dockerfile 基于centos7镜像搭建nginx服务
#RUN后面跟运行的命令,添加环境包
FROM centos:7
#用户信息
MAINTAINER THIS IS NGINX IMAGE
#RUN后面跟运行的命令,添加环境包
RUN yum -y update
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#将nginx-1.16.1.tar.gz解压后的内容复制到容器中的/usr/local/src目录
ADD nginx-1.16.1.tar.gz /usr/local/src
#将nginx-1.16.1.tar.gz复制到容器中的/usr/local/src目录
COPY nginx-1.16.1.tar.gz /usr/local/src
#切换的指定工作目录(相当于cd)
WORkDIR /usr/local/src/nginx-1.16.1
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定httpd端口
EXPOSE 80
#设置环境变量
ENV aa lss
#让nginx在后台运行,且不退出容器
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#设置启动容器的命令
#CMD ["nginx"]
#ENTRYPOINT
CMD ["sleep", "10901"]
#ENTRYPOINT ["sleep"]
#HEALTHCHECK
Harbor镜像仓库搭建与使用
Harbor概述
Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应得企业级扩展,
从而获得了更加广泛的应用,这些新的企业级特征性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业要求。
官方:https://goharbor.io/
Github : https://github.com/goharbor/harbor
Harbor部署:
下载docker-compose:
docker-compose-linux-x86_64
下载以后把文件上传的linux
#然后执行
# mv docker-compose-linux-aarch64 /usr/bin/docker-compose
下载harbor2.1.0版本:
harbor2.1.0
将软件包导入Linux服务器中
部署Harbor HTTP
#解压软件包
tar -zxvf harbor-offline-installer-v2.1.0.tgz
#进入解压后的目录
cd harbor
#复制文件并重命名
cp harbor.yml.tmpl harbor.yml
#修改配置文件
vi harbor.yml
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
#hostname: reg.mydomain.com --> 主机IP 192.168.124.128
hostname: 1922.168.124.128
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
#port: 443 #注释掉
# The path of cert and key files for nginx
#certificate: /your/certificate/path #注释掉
#private_key: /your/private/key/path #注释掉
#测试
./prepare
#安装
./install.sh
#使用IP进行访问(注:80端口不要被占用)
账号为:admin
密码为:harbor12345
配置http镜像仓库信任
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://2fzifa2u.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.124.128"]
}
重启docker
systemctl restart docker
#这时候harbor会连接不上,在harbor目录下执行
docker-compose up -d
docker-compose ps #查看服务有没有正常运行
打标签
docker tag centos_7:v1 192.168.124.128:/library/centos_7:v1
登录
docker login 192.168.124.128
账号:admin
密码:harbor12345
上传
docker push 192.168.124.128/library/centos_7:v1
下载
docker pull 192.168.124.128/library/centos_7:v1
docker-compose
是什么
Docker-compose是docker官方的开源项目,
负责实现对docker容器集群的快速编排。
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个引用。
你需要定义一个YAML格式的配置文件docker-compose.yaml,写好多个容器之间的调用关系。
然后,只要一个命令,就能同时启动/关闭这些容器
能干嘛
1.docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将
每个服务单独分割出来但是这样我们又面临了一个问题?
2.如果我们需要同时部署好多个服务,难道要每个服务单独写dockerfile然后在构建镜像,构建容器
,所以docker官方提供了docker-compose多服务部署工具
3.例如要实现一个Web微服务醒目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服
务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等。。
4.Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的
应用容器为一个项目(project)
5.可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,
完成构建。Docker-Compose解决了容器与容器之间如何管理编排的问题