docker的常规操作

想暗算我窗户都没有 · · 532 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

配置阿里云容器加速器

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软件

在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的镜像)

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:想暗算我窗户都没有

查看原文:docker的常规操作

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

532 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传