docker入门
一.认识docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
二.docker架构及特点
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
镜像是不可变对象
容器(相当于虚拟机)是可以改变对象
容器可以封装成一个镜像也就是说容器和镜像是可以相互转换的
三.docker常用操作
1.关于镜像
###############查看本地镜像 docker images ########删除镜像 docker rmi 镜像名称 docker rmi mysql:5.6 ###############从互联网上搜索镜像 docker search python ###############从互联网拉取(下载)镜像 docker pull python docker pull mysql:5.6
2.关于docker操作
################启动与关闭docker虚拟机 systemctl start docker systemctl restart docker systemctl stop docker ##############基于镜像创建容器并启动 -t(模拟终端) -i交互式 -d后台运行 dock run -tid 镜像id/name #############查看所有的创建的容器(包括运行和停止的) docker ps -a #############查看运行的容器 docker ps ############进入容器(当进入之后输出提示符显示容器id而不是虚拟机名称了) docker attach 镜像id/name docker exec -it 容器ID /bin/bash ############退出容器 exit #这种方式退出容器也会停止运行 ctrl +pq #不停止运行退出,一个一个键按下,不用同时按 ############给容器起名字(创建容器的时候) docker run -tid --name XXX 镜像id ############启动并进入容器 docker start id/name docker exec -ti name bash docker exec -ti 容器名 bash -c "mysql -uroot -p123" docker run -d centos /bin/sh -c "while true;do echo 爱滴魔力转圈圈; sleep 1;done" -d # 后台运行容器 /bin/sh # 指定使用centos的bash解释器 -c # 运行一段shell命令 "while true;do echo 爱滴魔力转圈圈; sleep 1;done" # 在linux后台,每秒中打印一个 爱滴魔力转圈圈 ########停止、挂起、恢复容器 docker stop 容器ID或者名称 docker pause 容器ID docker unpause 容器ID #########查看容器的信息 docker inspect 容器名称/id ###########基于容器封装成镜像 docker attach id/name #进入容器 在容器一些操作,安装环境等(的那个鱼给docker增加饿了东西) docker commit 容器id/name 镜像名称:tag ##########容器间通信 docker run -tid --name h1 镜像名:tag docker run -tid --name h2 --link h1 镜像名:tag(和上面的镜像是用一个) #########删除容器(删除容器之前必须先停止容器) docker rm 容器名称 -f #########把导出来的镜像文件还原成镜像状态 docker load --input 文件名称 docker load < 文件名称 #########把镜像封装为文件 docker save -o /文件名.tar 镜像id docker save 镜像名称 > 新文件名 #######打印docker日志 docker logs -f 容器id # 不间断打印容器的日志信息
三.docker运行后额一些操作
1.运行一个而UN不能图镜像并且查看版本
#下载一个ubuntu镜像 docker pull ubuntu #下载完成之后,查看已经下载的ubuntu镜像 docker images #运行这个ubuntu镜像, 并产生一个容器实例,使用交互模式进入这个容器内部 docker run -it ubuntu /bin/bash #查看这个ubuntu系统的版本 cat /etc/os-release
2.运行一个web服务器,并且通过ip+端口访问
#下载webapp [root@instance-hrnebyqu opt]# docker pull docker.io/training/webapp Using default tag: latest Trying to pull repository docker.io/training/webapp ... latest: Pulling from docker.io/training/webapp #查看下载下来的镜像 [root@instance-hrnebyqu opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 5c4f50b73b1b About an hour ago 341 MB docker.io/ubuntu latest 94e814e2efa8 6 weeks ago 88.9 MB docker.io/training/webapp latest 6fae60ef3446 3 years ago 349 MB #创建容器并且随机指定一个端口 -P参数 [root@instance-hrnebyqu opt]# docker run -d -P 6fae 191bc499334d7251be4ff79810b78f7bf04c59784b6ad763b57176de6d0b5b7b #查看docker的运行状态 [root@instance-hrnebyqu opt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 191bc499334d 6fae "python app.py" 5 seconds ago Up 4 seconds 0.0.0.0:32768->5000/tcp mystifying_chandrasekhar 9f1508c46ae5 94e "/bin/bash" About an hour ago Up About an hour heuristic_leakey 0489cd158754 94e8 "/bin/bash" 7 hours ago Up About an hour ubuntumysql
#随机端口 参数是-P
#指定端口运行 参数 -p 是小写的p
[root@instance-hrnebyqu opt]# docker run -tid --name qishi_web -p 9999:5000 6fae
92de5d945f3d483acc79366e37cde33c471bb0821ec5837fb9227833ec3c251f
四.镜像的发布
1.公有仓库
1.docker提供了一个类似于github的仓库dockerhub, 网址https://hub.docker.com/需要注册使用
2.注册docker id后,在linux中登录dockerhub docker login #注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
#这样其实在修改tag后会生生一个新的镜像 语法是: docker tag 镜像名 用户名/仓库名
docker tag image—name tjp40922/centeos 3.推送docker image到dockerhub docker push tjp40922/centos:latest
4.在dockerhub中检查镜像 https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件 docker rmi -f d69 docker pull tjp40922/centos
2.私有仓库
但是这种镜像仓库是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库
1#官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/repository/registry.html #一条命令下载registry镜像并且启动私有仓库容器 docker pull registry
#私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下 端口映射容器中的5000端口到宿主机的5000端口 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry #检查启动的registry容器 docker ps
#测试连接容器 telnet 192.168.119.10 5000
#修改镜像tag,以docker registry的地址+端口开头 docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest
#查看docker镜像
#Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,这里必须写正确json数据 [root@master /]# vim /etc/docker/daemon.json { "registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] } #写入到docker服务中,写入到[Service]配置块中,加载此配置文件 #打开docker服务的配置文件:#写入以下内容: #写入的时候,要注意,把这个配置文件加入到[Service]代码块中
vim /lib/systemd/system/docker.service
EnvironmentFile=-/etc/docker/daemon.json
#修改了docker配置文件,重新加载docker systemctl daemon-reload #重启docker systemctl restart docker # 注意,重启docker服务,所有的容器都会挂掉
#重启了docker,刚才的registry容器进程挂掉了,因此重新启动它 docker ps -a docker start registre容器id #推送本地镜像 docker tag docker.io/ubuntu 106.12.112.139:5000/qishi_ubuntu #由于docker registry没有web节目,但是提供了API数据 官网教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog
或者浏览器访问http://106.12.112.139:5000/v2/_catalog
#删除本地镜像,从私有仓库中下载 docker rmi -f `docker images -aq` docker pull 106.12.112.139:5000/qishi_ubuntu