配置阿里云容器加速器
- 0 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 1 配置阿里云镜像加速器:cd /etc/docker/daemon.json,
- 2 vim daemon.json 把: {"registry-mirrors": ["https://3tg72qr.mirror.aliyuncs.com"]} 填上
- 2_2 在镜像中心-镜像加速器- (https://3tg72qr1.mirror.aliyuncs.com)
- 3 配置后L : systemctl daemon-reload
- 4 重启: systemctl restart docker
image 镜像是啥!
- 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包(镜像:一句话就是模板文件)。
- Docker 镜像可以看作是一个特殊的文件系统,是一个包含了运行容器的各种资源的文件系统
- 容器是一个进程集合,只不过把系统的其他资源给隔离开!形成独立的文件系统。其他资源包括网络资源,进程,文件系统等等。
- 1 容器化本质上就是虚拟化的改进版本,这种技术允许多个应用程序驻留在同一个服务器中,不过两者之间有区别的,虚拟化是在硬件级别分离应用程序,而容器化则是在操作系统级别分离硬件程序.
- 2虚拟化使得操作系统可同时在单个硬件系统运行。
- 3 容器则可共享同一个操作系统的内核,将应用进程与系统其它部分隔离开。例如:ARM linux系统运行ARM Linux容器,x86 Linux系统运行 x86Linux容器,x86容器具有极佳的可移植性,但前提是它们必须与底层系统兼容。
- 4 这意味着什么?虚拟化会使用虚拟机监控程序模拟硬件,从而使多个操作系统能够并行运行,但这不如容器轻便。事实上,在仅拥有容量有限的资源时,需要能够可以进行密集部署的轻量级应用。linux容器在本机操作系统上运行,与所有容器共享该操作系统,因此应用和服务能够保持轻巧,并行化快速运行。
- 5 linux容器镜像提供了可移植性和版本控制,确保能够在开发人员的笔记本电脑上运行的应用,也能在生产环境中运行,相较于虚拟机, Linux容器在运行时所占用的资源更少,使用的是标准接口 (启动,停止,环境变量等)并会与应用隔离开,此外,作为(包含多个容器)大型应用的一部分时更加易于管理,容器可以跨多个云环境进行编排。
- 6 一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的容器,会导致出错。
容器的生命周期(1创建 2运行 3暂停 4关闭)
- 1 容器是进程文件的一种集合,隔离性比VM要差,因为消耗的资源相对VM要少很多。
- 2 镜像一次构建,到处运行的特点。镜像就相当于文件系统!
- 3 容器的生命周期和inition的周期是一致的,当inition退出的时候,容器也就退出了.
- 4 容器退出,但是数据是要可持久化的存储,这个就是数据卷了,它负责容器退出后数据的可持久化存储!
- 5 K8S里的调度器会观察容器所需的大小规格(内存,CPU之类),然后在集群中选一个比较空闲的机器来进行放置的操作!
- 6 K8s有3个能力,1调度 2自动恢复 3水平伸缩动态扩容
docker开启守护进程
- 1 sudo systemctl start docker 开启守护进程后才能在控制台正常显示信息
- 2 systemctl stop docker 停止守护进程
- 3 systemctl enable docker (docker守护进程开机自启)
docker在ubuntu安装流程
设置root密码:sudo passwd root
0 查看版本/虚拟环境: uname -a || ls -l /sys/class/misc/device-mapper
1首先更新软件源 apt-get update (不懂看这https://cloud.tencent.com/developer/article/1617353)
2 安装安全插件: apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y
3 更换官方的docker下载源: sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4 设置Docker稳定版仓库 : sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5 升级下 :apt-get update
6 安装最新版本Docker CE(社区版): sudo apt-get install docker-ce -y
7 安装完毕后可以检查: docker version 版本
8 完毕后多了一个网卡IP : ifconfig (docker 0 )
9 systemctl stop docker (关闭服务命令)
10 systemctl start docker (运行服务)
11 systemctl status docker ps (查看状态)
image镜像的操作
- 12 docker search (ubuntu) (搜索镜像)
- 13 docker pull (ubuntu) (拉取镜像)
- 14 docker images 镜像名称 (查看镜像)
- 15 docker tag nginx:latest nginx-panda:v1 (重命名镜像)
- 16 docker rmi (镜像ID / 或者镜像名称+版本号) (删除镜像!)
- 17 docker save -o nginx-panda.tar nginx (压缩镜像文件)
- 18 docker load < (--input) nginx-panda.tar (压缩后的镜像文化名) (解压加载被压缩后的镜像)
- 19 cat ubuntu-16.10-x86_64.tar.gz | docker import - ubuntu_iso (解压创建一个本地镜像!)
- 20 docker history ubuntu_iso:latest (查看镜像的历史操作命令:镜像名称+版本号)
- 21 docker inspect ubuntu_iso:latest (查看一个镜像的详细信息)
- 22 docker create -it --name [容器名称] [依赖的容器镜像名字] ls -al (创建一个容器镜像!!成功后会在containers生成一个文件)
- 23 docker start -a 77e964f66402(容器ID) 启动一个容器
- 24 docker ps -a (查看运行中的容器!)
- 25 docker run (参数) (镜像名称) (执行命令) (创建并且启动容器的命令,创建容器是依赖于镜像的!) :
--- docker run --rm --name ubuntu_iso ubuntu /bin/echo "HelloWorld" (启动容器并且删除,然后输出信息)
--- --name 不起名字系统就会随机起一个, --rm 删除!
创建并且启动运行容器的命令
- 容器是依赖镜像存在,如果镜像删除就无法启动该容器了!!!
- 1 docker run -d ubuntu-1 (以守护进程的方式启动, 随机生成名字)
- 2 docker run -it ubuntu-1 (启动并且直接进入容器, 没加 --name 就随机生成名字)
- 3 docker stop e3760ab45792 (关闭容器)
- 4 docker start e3760ab45792 (开启容器)
- 26 docker run -d --name ubuntu_iso ubuntu (守护进程的方式启动容器, 区别在于-d的参数)
暂停容器和取消暂停
- 27 docker pause 57b0ed72efe1(容器ID) (暂停容器的命令)
- 28 docker unpause 57b0ed72efe1 (容器id) (接触暂停容器命令)
删除容器的3种方法
- 29 docker rm (容器id) (删除只能删停止运行的!)
- 30 docker rm -f nginx_2 (-f 强制删除正在运行的容器!)
- 31 docker rm -f $(docker ps -a -q) (强制删除所有的容器)
进入容器的方法
- 32 docker run -it --name nginx-2 nginx /bin/bash (创建容器并且进入容器的方式)
- 33 docker run -it -d --name nginx-1 nginx /bin/bash (另外一种手动进入容器的方法,先创建并且运行了,区别在于 -d 参数会导致创建容器的时候就启动了,)
- 33_2 docker exec -it nginx-1 /bin/bash (这是第二步,这才真正进入容器环境里面了!,前一步只是创建容器, 只能用于已经运行的容器进入!)
把容器保存成镜像储存
- 1 docker commit -m "golang ubuntu iso"(创建信息) -a "sos"(作者信息) cf1785e3a68f(容器ID) ubuntu-iso-1:v1 (镜像名字:版本)
- 2 docker export (容器ID) > 模板文件名.tar (docker export e43df5b05295 > ubuntu-1.tar)
- 3 cat mysql_iso_1.tar | docker import - mysql_con (把容器压缩包生成镜像!)
查看容器的详细信息
- 1 docker inspect e3760ab45792 (容器id)
查看容器的端口映射
- 1 docker port nginx-3
修改容器名字
- 1 docker rename e3760ab45792(容器id) nginx-con(新名字)
数据卷
- 1 就是共享文件,达到映射的效果,对数据卷的更新,不会影响镜像,卷会一直存在,直到没有容器使用.
- 2 docker run -itd --name nginx-con2(容器名称) -v /var/lib/docker/go/:/go-text nginx(依赖的镜像) (进入容器后跟外面的路径映射起来,形成数据共享!)
- 3 把数据卷容器跟容器挂载起来,把数据卷挂载在容器下面,容器之间进行数据共享以及增删改查的操作
- 4 docker create -v /data-test (数据卷挂载的目录) --name nginx-demo(数据卷容器的名称) nginx (依赖镜像) ——(数据卷目录会挂载到进入容器里的目录下)
- 5 docker run --volumes-from nginx-demo -itd --name demo1 nginx
- 6 docker run --volumes-from nginx-demo -itd --name demo2 nginx (创造2个容器,把数据卷容器挂载进来nginx-demo)
- 7 docker exex -it demo1 /bin/bash 2个容器都进来后,在data-test目录里共享数据!!! 这个目录所有操作都会共享资源
备份数据卷容器
- 1 备份数据:
网络
- 0 apt-get install bridge-utils (软件安装!)
- 1 端口映射,随机分配端口: docker run -d -P --name nginx-1 nginx
- 2 可以指定ip访问 : docker run -d -p(小写) --name nginx-2 nginx
- 3 可以指定多个IP和端口映射80端口访问: docker run -d -p 10000:80 10240:80 --name nginx-3 nginx
- 4 查看容器的网络相关信息 : docker inspect nginx-3
- 5 查看端口映射情况:docker port nginx-3
- 6 创建一个网络:docker network create --driver bridge bridge-demo1
- 7 容器网络连接断开命令: docker disconnect
- 8 查看网络的详细信息: docker network inspect bridge-demo1
- 9 自定义网段和网关 : docker network create --driver bridge --gateway 172.99.0.1 --subnet 172.99.0.0/16 bridge-demo2
- 10 创建一个容器,并且指定网络:docker run --net=bridge-demo2 -itd --name nginx-2 nginx
- 11 断开容器的网络连接: docker network disconnect bridge-demo1 nginx-1
- 12 重新让容器连接网络: docker network connect bridge-demo2 nginx-1
brctl软件的安装及修改默认的 docker 网桥,使用自己设定的网桥访问!
- 0 brctl 软件是创建网桥用的!
- 1 网桥软件的安装:apt-get install bridge-utils
- 2 创建网桥:sudo brctl addbr br0 (网桥名称)
- 3 给网桥设定网段和IP地址:sudo ifconfig br0 192.168.99.1 netmask 255.255.255.0
- 4 修改网桥配置文件 : vim /etc/default/docker
- 5 创建一个文件夹 : mkdir -p /etc/systemd/system/docker.service.d
- 6 创建一个文件: vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf
- 7 在Using_Environment_File.conf 文件里写上,以并关联更改网桥的文件:
--[Service]
--EnvironmentFile=-/etc/default/docker
--ExecStart=
--ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS - 8 重新加载:systemctl daemon-reload
- 9 重启docker : systemctl restart docker
- 10 在创建容器后会发现网桥信息变更了:1 docker run -itd --name nginx-3 nginx ,2 docker inspect 842090eeb31f ,3 docker network inspect bridge
- 11 接下来重新创建一个容器, 网络采用host模式:docker run --net=host -itd --name nginx-1 nginx
- 12 执行查看可以发现多了个80端口:docker network inspect host, docker inspect nginx-1
- 13 现在可以直接用宿主机的iP直接访问容器所代表的镜像的业务页面!!
容器是允许外部访问的
- 0 docker run -itd --net=host(模式) --name nginx-1 nginx ---80 端口直接就能使用IP访问!
- 1 随机分配端口,利用宿主机IP(服务器就是公网IP)访问:docker run -d -P --name nginx-1 nginx 可以指定IP和端口
- 2 创建容器的时候默认采用bridge网络模式来进行容器之间通信
- 3 可以指定主机IP访问:docker run -d -p(小写) 192.168.1.4::80 --name nginx-2 nginx
- 4 可以在终端用内网访问:curl 192.168.99.2:8080 (-p 创建容器的时候指定的端口映射)
网络模式: bridge, host ,none
- 0 bridge 模式只有宿主机能与该容器进行通信
- 1 host 模式是 bridge 桥接模式很好的补充
- 2 采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信
- 3 采用host模式后,网络环境隔离性的会弱化。
- 4 host模式需要在创建容器时指定!!!(docker run --net=host -itd --name nginx-1 nginx)
- 5 none模式禁用了网络功能,只有IO接口
- 6 查看网络模式的详细信息: docker network inspect none
安装pipework软件
- 1 git clone https://github.com/jpetazzo/pipework
在docker 容器里创建mysql
- docker run -d -p 6666:3306 -e MYSQL_ROOT_PASSWORD=1234(Mysql密码设置) --name mysql-1 mysql:5.7 (版本号)
- docker cp mysql-1:/etc/mysql/mysql.conf.d/mysqld.cnf /mysql/conf/ (把容器中文件拷贝到主机中!!!也就是外面来操作!!因为容器内部没有相关命令操作)
- (把外面创建的文件夹挂载到Mysql容器内部) docker run -d -p 6666:3306 -v /mysql/conf:/etc/mysql/mysql.conf.d/ -e MYSQL_ROOT_PASSWORD=1234 --name mysql-1 mysql:5.7
- 设置Mysql中文字符集,在mysql.conf.d文件里配置 :character-set-server=utf8
自定义网络让主机跟容器内部进行通信
- 1 首先创建一个网络:docker network create --driver bridge --subnet 172.22.16.0/24 --geteway 172.22.16.1 my_net2
- 2 创建一个容器指定网络:docker run -itd --net=my_net2 busybox
- 3 可以查看网卡的关联关系: ip a
- 4 进入对应容器:docker exec -it 94dedbe6cd93 /bin/bash
- 5 查看网卡关联信息: ip a 看到有关ip地址
- 6 ping通试试: ping 172.22.16.1(IP)
- 不同网桥的容器通信可以用connect来连接:docker network connect **(网桥名称) **(容器名称)
- 但是docker的系统自带的网桥之间:是可以通信的,因为是在一个网络桥接上。
查看服务器里tag 为none的镜像ID
- 1 docker images | grep none | awk '{print $3}' | xargs docker rmi (删除该为none的镜像)
有疑问加站长微信联系(非本文作者)