docker

docker介绍,与传统虚拟机比较:

docker不需要虚拟硬件和操作系统,轻量级,占用体积小,启动快。

  • VMware,kvm:底层是在一个很强健的操作系统上虚拟出很多操作系统。
  • 现在使用的很多与服务器就是通过vm或kvm虚拟化出,阿里云,腾讯云再使用opensatck(开源),阿里飞天等管理虚拟化的操作系统,
  • docker:进程级别隔离。在自己的阿里云服务器上安装doker,本质也是隔离操作系统,隔离网络,隔离硬件,装在虚拟机,云服务器上,一个云服务上可以跑很多的docker容器,只要服务器一多,就能跑成倍的容器。
  • k8s:管理不同机器上的成堆容器。

docker没有操作系统的概念,用的还是主机的操作系统,但是docker实现了隔离.

传统方式则是在硬件层面实现。

kvm里面建docker kvm vs docker_centos

docker架构图

docker是一个C/S架构。

数据卷:Filesystem。假设现在mysql正在运行,那么表放在容器中还是宿主机上,放哪都可以,但是容器如果被删除数据库表也会被删除,但是docker支持将表放在宿主机上,再起容器表还在,以后项目,Redis都是放在宿主机上。

kvm里面建docker kvm vs docker_kvm里面建docker_02

docker安装

windows安装

1 windows安装(不建议你装)http://get.daocloud.io/

乌班图

# 0 卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
# 1 安装必要工具
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 2 安装GPG证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#换成阿里云
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 2 写入软件源信息
#官方
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#换成阿里云
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 3 更新并安装docker-ce
sudo apt-get -y install docker-ce
# 4 开启docker服务
 systemctl status docker

centos上安装(必须7.0以上)

# 6.8安装docker,自行搜索,升级内核版本
# docker是在linux3.1以上内核中写出来的,在乌班图下开发的,docker的新特性,乌班图先看到,
# 官方建议docker运行在centos7 以上的系统

#####安装
0 卸载
yum remove docker docker-common  docker-selinux docker-engine
rm -rf /var/lib/docker

1 更新yum
yum update
2 安装需要的软件包, yum-util 
yum install -y yum-utils device-mapper-persistent-data lvm2
3 执行(向你的yum源,增加一条记录)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4 安装 
yum install docker-ce

5 验证安装(查看版本)
docker -v  
~]# docker -v  (19年03月12日发布)
# 自从分了docker-ce和docker-ee以后,以年份命名版本
Docker version 19.03.12, build 48a66213fe

6 启动docker服务
systemctl start docker

7 停止docker服务,重启docker服务
systemctl stop docker
systemctl restart docker

8 开机启动	
systemctl enable docker

9 查看概要信息
docker info(你可能写了一个管理docker的运维平台)

3.4 远程仓库

# 注册,登录 https://hub.docker.com/
# 你可以上传镜像(类似于github),你把你制作的镜像传上去,别人可以下载使用

# 配置加速(之前去https://hub.docker.com/),阿里云,清华,做了一个备份,配置好以后,再拉镜像会去国内地址拉取
第一步:vi /etc/docker/daemon.json  
第二步:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

4 镜像操作

1 第一个hello-world(没有任何意义)
	docker run hello-world
	1 客户端连到服务端,服务下载了hello-world镜像
    2 通过镜像跑起容器来
    3 容器输出一些东西,通过服务端发送给客户端,客户端展示在窗口里了

2 查找镜像
	方式一:https://hub.docker.com/ 点点点搜索(你用这种)
  方式二:docker search 
3 拉取镜像 
	docker pull hello-world  最新版本latest
	docker pull hello-world:nanoserver
4 查看机器上有哪些镜像
 	docker images
    REPOSITORY  TAG   IMAGE ID   CREATED   SIZE
	   镜像名字    版本     id号     创建时间   大小
      
5 删除镜像
	docker rmi 镜像名字/id号(# 如果还有基于这个镜像的容器,是不允许删除镜像的,先删除容器,再删除images)
    
6 拉取python3.6镜像,redis最新镜像,mysql5.7镜像
    docker pull python:3.6
    docker pull redis
    docker pull mysql5.7
    docker pull centos:centos7
    
7 镜像是什么?
	-就是一堆文件,这堆文件通过docker跑起来,就是容器,你现在就把他当成,一个操作系统内跑了这个软件(centos+redis)
    -假设centos7的镜像跑起来,容器你就当成在你宿主机上跑了一个centos7的操作系统(可以想成跑在虚拟机)
    
    
    
 8 补充(了解)
	docker image inspect 46ff56815c7c
  docker image ls
  docker image rm

5 容器操作

1 删除容器
 docker rm 容器名字/容器id
    
2 启动并运行容器
	# 通过centos:centos7镜像,创建一个容器名字叫mycentos,并且把它运行起来
	docker run -di --name=mycentos centos:centos7
[root@iZuf6h25s48rokq4m2fal7Z ~]# docker run -di --name=mycentos centos:centos7
# 打印出容器的id号
	31babaf539c944da3480d8a2fb4333be8b9729d45d58517b2e7e8f62849947b2
3 查看机器上正在运行的容器
	docker ps
4 查看宿主机上所有的容器(包括停止的)
	docker ps -a
5 停止容器
	docker stop 容器名字/id号
6 启动容器
	docker start 容器id/名字

容器的创建并启动

7 容器的创建和启动(******)
	-创建:docker create --name=xxx redis
  	# ps -A 预设一个命令,启动这个容器就运行预设命令
    docker create --name=test-container centos:centos7 ps -A
    -启动
    docker start test-container
    
    -容器一直运行的原因
    	-它有一条前台进程,一直在运行
        -以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
        -如果该命令结束,该容器也就结束了
        
    -创建并启动(run)
    -i:表示运行容器
    -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
    --name :为创建的容器命名。如果不写,会自动分配一个名字(英文人名)
    -v:表示目录映射关系(前者是宿主机目录,后者是容器目录,映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
    
    # 注意:docker run -it 并不是说进入容器内部,而是分配一个为终端,对其进行交互
    docker run -it --name=myredis redis
    	
 # 注意,docker run  镜像 如果本地没有,会先pull,再run
8 与容器交互的方式:
	第一种:docker exec -it  容器id /bin/bash
    	docker exec 容器id ls 
        exec真正的作用是在容器内执行命令
    第二种:ssh连接(容器内部装ssh服务端)
9 退出
	exit
    
10 文件拷贝
	-从宿主机拷贝到容器内部
    	docker cp lqz.txt 容器id:/home
    -从容器内部拷贝到宿主机
    	docker cp 容器id:/home/lqz.txt /app
        
11 目录挂载(只能挂载目录,挂载完毕后显示目录下的文件,目的是为了删除容器后数据不会丢失,当再次起一个容器依旧可以挂载此目录,数据都在)
	# /home/junjie:/home--> 宿主机需要挂载的目录/挂载到容器的某个目录,容器中所做的增删改同步到宿主机,一旦挂载,以后宿主机目录内修改,同样影响容器内部
	docker run -di --name=mycentos99 -v /home/lqz:/home centos:centos7

12.端口映射

# redis服务监听着6379端口,6377 宿主机的6377端口映射到容器的6379端口
docker run -di -p 6377:6379 redis:latest
# 了解:/usr/local/bin/docker-entrypoint.sh

kvm里面建docker kvm vs docker_容器_03

打开rdm,由于容器映射了6377端口,此时链接,便可以看到在容器中设置的name

kvm里面建docker kvm vs docker_centos_04

kvm里面建docker kvm vs docker_kvm里面建docker_05

Redis数据存放与内存,理论上我们关闭容器重新起一个redis容器,之前的数据是不存在的,但是Redis中配置文件配置了可以持久化存储,所以再起一个Redis依旧可以看到数据。

13 查看容器详细信息

# 在容器中查看ip
yum install net-tools

docker inspect 容器ID
# 查看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

# 输出:
[root@iZuf6h25s48rokq4m2fal7Z opt]# docker inspect --format='{{.NetworkSettings.IPAddress}}' bc9
172.17.0.2
[root@iZuf6h25s48rokq4m2fal7Z opt]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5620
172.17.0.3

14 链接mysql

# 在容器内部署mysql
# -e表示环境变量

docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
        
# 在容器内部署redis
docker run -di -p 6377:6379 redis:latest
        
# 在容器内部署nginx
docker run -di --name=mynginx -p 8080:80 nginx