1.什么是linux容器?
-
Linux容器是与本机系统其他部分隔离开的一系列进程,从一个镜像运行,并由该镜像提供支持进程所需的全部文件(包含了所需要的服务,依赖)
-
容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性
优点:
你在开发一个应用,你的开发环境具有特定的配置与环境,你正在开发的应用依赖于你当前的环境,其他开发人员身处的环境配置可能是不同的,要依赖于他自己的某些特定文件,与此同时,比如说三翼服务器又有自己的一套环境,具有自身的配置和一系列支持文件,你想要的是尽可能多在本地模拟这些环境,而不是去重新耗时耗力地去搭建服务器环境。
与虚拟化的区别:
-
虚拟化:许多操作系统可同时在单个系统上运行,比方说就是一台电脑你可以装linux系统,也可以是windows系统,你到操作中心去上课的时候,可能会看到让你选操作系统地页面,这也就是多个OS在单个系统上运行。
-
容器:容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开,也就意味着linux容器在单个操作系统中运行,所有的容器共享这个操作系统,而容器里可以是各种服务,也可以是操作系统。
2.什么是Docker
-
IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用 Linux 容器。开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益
-
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。是一种容器工具
-
Docker的目标:
-
构建:做一个docker镜像
-
运输:docker pull
-
运行:启动一个容器
-
为什么要用:
-
更快速的交付和部署:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序
-
更轻松的迁移和扩展
-
更简单的管理
应用场景:
-
本地依赖:使用虚拟的话,经常需要为开发环境的机器加内存,而通过 Docker 可以轻易的让几十个服务在 Docker 中跑起来,也能我们快速搭建开发环境
-
微服务:微服务架构 ,即将一个整体式的应用拆分成松耦合的单个服务
-
自动测试,持续部署,多租户环境,扩容
3.安装
4.使用
-
使用docker的目的是为了搭建一个轻量的环境供我们使用,一个项目跑起来需要很多服务,比如一个项目的技术栈包含有php,mysql,redis,以及调用这些的nginx服务器所以第一步是拉取这些服务
-
镜像(之前也有提到,镜像提供支持进程所需的全部文件,所以拉去了镜像也就拉下了服务)
-
docker search centos //docker搜索官方仓库镜像 NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 3992 [OK] ansible/centos7-ansible Ansible on Centos7 105
-
docker pull centos //根据镜像名称拉取镜像
-
docker image list //查看当前主机镜像列表 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB nginx latest 3f8a4339aadd 5 weeks ago 108MB
-
docker image rm centos:latest //删除镜像
-
docker image inspect centos(镜像名)
-
-
容器(创建介绍下我自己的写法)
-
docker run -itd --name 镜像名 -v 目录挂载 -p 端口映射 /bin/bash //自动创建并跑起来了一个容器
-
docker exec -it clsn1 /bin/bash //进入容器
-
-p参数端口映射
-
[root@docker01 ~]# docker run -d -p 80:80 nginx:latest 079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
-
-
-v挂载卷
-
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest 079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
宿主机/data目录映射到容器内部/usr/share/nginx/html目录下,在宿主机的文件或内容的增删改查都会同步至容器内,所以一般的用途是数据备份,配置文件的修改调试,日志的查看
-
-
剩余的有容器的保存为镜像,以及上传到社区内等等自行拓展,这里就不展开,菜鸟
-
-
5.Dockerfile
-
构建镜像命令的集合
-
命令:
FROM (指定基础镜像) MAINTAINER (指定维护者信息,可以没有) RUN (在命令前面加上RUN即可) ADD (COPY文件,会自动解压) WORKDIR (设置当前工作目录,也就是cd) VOLUME (设置卷,挂载主机目录) EXPOSE (指定对外的端口) CMD (指定容器启动后的要干的事情)
-
[root@docker01 base]# vim Dockerfile FROM centos:6.8 RUN yum install openssh-server -y RUN echo "root:123456" |chpasswd RUN /etc/init.d/sshd start CMD ["/usr/sbin/sshd","-D"]
6.Docker Composer
-
创建容器的命令集合
-
命令:(很简单明了,直接看示例文件)
-
version: '3' services: web: image: "/laravel:nginx1.17.5" container_name: "res_nginx" ports: - "10308:80" volumes: - ./:/var/www/html/ - ./dockercnf/nginx1.17.5/etc:/etc/nginx # - ./dockercnf/nginx1.17.5/conf.d:/etc/nginx/conf.d # - ./dockercnf/nginx1.17.5/ssl/:/etc/nginx/ssl/ - ./dockercnf/run:/sock depends_on: - php php: # build: ./dockercnf/php7.3-fpm/ image: "/laravel:php7.4-fpm" container_name: "res_php" privileged: true volumes: - ./dockercnf/run:/sock - ./:/var/www/html/ - ./dockercnf/php7.3-fpm/php-fpm.d:/usr/local/etc/php-fpm.d - ./dockercnf/php7.3-fpm/php:/usr/local/etc/php/php depends_on:....
-
启动
#启动方法:docker-compose up #后台启动方法:docker-compose up -d
7.容器连接
-
Docker中的四种网络模式:(介绍下bridge模式)
-
bridge模式:bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将并将一个主机上的Docker容器连接到一个虚拟网桥上。当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理端口,在宿主机上作为一块虚拟网卡使用
-
host模式
-
none模式
-
container模式
-
-
-
在这里,我们可以看到Docker0相当于一个路由器的作用,任何一个容器启动默认都是docker0网络,docker默认会给容器分配一个可用ip,这个ip就是这个容器的ip(Docke服务中的),并把它同docke0相连,而各个容器之间并没有相连
互联
-
方法一:--link命令
docker run -d -p 8083:8080 --name tomcat03 --link tomcat02 tomcat
但是link是单向的,方法比较过失
-
方法二:自定义网络(推荐)
思路:创建一个的网段,然后将各个容器放进其中,相当于这个创建了一个微型局域网,在这个网络内各个容器之间是相通的,且与其他网络隔离
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet //默认使用的driver也就是在docker0上创建一个网段 subnet是划分的子网地址 gateway即给这个网段划分的网关,要是报错没有地址了换成24等
docker inspect mynet //查看网络 docker network connect mynet 容器名 //将容器放入网络中
值得注意的是网络里的ip地址由于是虚拟的,所以很容易改变,所以在用到容器的时候尽量使用容器名
架构: