docker的常规操作

docker 的结构
  • 1 镜像
    -- 镜像是一个模板文件,提供容器运行时所需的程序,库,资源和配置,还有为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

  • 2 容器
    -- 容器是镜像的运行实例,容器根据镜像生成一个隔离的应用程序的环境包,每个容器都是一个标准化的单元,确保了在不同机子上也能拥有一致的行为。

  • 3 数据卷
    -- docker 对数据的持久化方案,数据不会随着容器结束而丢失,通过将宿主机的某一文件目录挂载到容器里来实现。在 Docker 里提供了三种方法来实现目录的挂载:
    -- volumes: 属于 Docker 管理的目录,无需自己创建目录
    -- bind mounts:自己指定的某个目录,需注意不同操作系统的文件路径格式。
    -- tmpfs:仅存储在主机系统的内存中,不会持久保存在磁盘上。容器可以使用它来共享简单状态或非敏感的信息。

  • 4 网络
    -- bridge 模式
    ---【 Docker 在主机上会创建一个 docker0 的网桥,每当有容器要创建时,便会为容器分配一个独立的网卡,然后桥接到虚拟网桥上。这其实是一对虚拟网卡,一端放在容器里,另一端放在 docker0 网桥里。当一端有数据达到时,就会把数据包转发到另一端上,这就实现了网络通信。】

-- host 模式
---【在建一个容器时,一般会为容器分配一个独立的 Network Namespace 以进行网络隔离。如果我们使用了 Host 模式,则不再分配 Network Namespace,而是和宿主机共用一个 Network Namespace。此时容器将不再拥有自己的虚拟网卡、IP 和端口,而是和宿主机共用一个 IP 和端口。】

-- none 模式
--- 【使用 none 模式的容器拥有属于自己的 Network Namespace,但不做任何网络配置。它和宿主机以及其他容器是不互通的。如果需要和外部通信,则需要自定义网络驱动程序,自己添加网卡、配置 IP 等。】

配置阿里云容器加速器

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

  • 查看版本/虚拟环境: 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软件

在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的镜像)
Dockerfile
  • Dockerfile是用来构建docker镜像的文件,是由一系列命令和参数构成的脚本。
  • 1.编写dockerfile文件
  • 2.docker build 基于Dockerfile建造镜像文件
  • 3.docker run 运行容器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353