什么是docker
什么是docker,大家或多或少都会谈及容器技术,所谓容器就是可以在host上相当于一个进程的存在,容器的核心技术是内部提供了运行环境,管理工具,以及OS等。基于容器可以提供运行环境,os这些特性,可以作为软件发布的一个打包技术。针对开发人员来说就是一次build 到处run,针对运维可以说是一次配置,到处run。编排容器的目前主流的有K8S,docker swarm,mesos。Docker Hub是官方提供的仓库。用户可以进行pull和push
Docker的结构
docker包括一个客户端说白了就是docker命令,一个Server就是用来接收docker命令的守护进程服务,还有最关键的镜像,还有容器层,以及容器的仓库。
docker命令
Commands:
attach 进入一个容器不会新开一个终端
build 通过Dockerfile构建镜像
commit 创建镜像但是不推介使用应为不可控,官方推介使用基于Dockfile的构建方式
create 创建容器
exec 进入容器ep:docker exec -it my-image bash
history 可以查询容器的历史记录包括其构建顺序
images 列出所有的镜像
info 查询docker的消息包括容器个数cgroup信息network信息
kill 用于kill掉一个容器,只能是runing状态的容器,实际是想容器内部发送一个SIGKILL信号。
ps 列出所有活跃的镜像 加-a可以显示全部镜像包括exited的
pull 拉取镜像
push 推送镜像
rename Rename a container
restart 重启镜像
rm 删除非run状态的容器
rmi 删除镜像,当所有镜像tag被删除,该镜像就被删除了
run 运行该容器相当于(create+start)命令的组合
search 在公共仓库搜索镜像
start 启动容器
stop 停止一个或者多个run状态的容器
tag 给镜像打tag
pause 挂起容器,挂起的容器只能被unpause命令唤醒。
unpause 重新运行容器
基于上述的命令,可以做到所有的容器操作,搜索镜像,发布镜像。部署容器,已经进入容器操作。这么命令相当于API一样,帮助我们操作容器。接下来就去看下docker的镜像
docker镜像
镜像可以说是整个docker的灵魂核心了,docker的容器层由镜像构建出来,由镜像才能启动容器。先启动一波hello-world镜像看一波,helloworld镜像一般用于检测docker时候安装成功。
首先拉取容器
[root@Mood mood]# docker pull --nocache hello-world
unknown flag: --nocache
See 'docker pull --help'.
[root@Mood mood]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Image is up to date for docker.io/hello-world:latest
[root@Mood mood]#
查看我们的本地的镜像
[root@Mood mood]# docker images hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest fce289e99eb9 2 months ago 1.84 kB
[root@Mood mood]#
我们执行以下来看
[root@Mood mood]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...欢迎信息省略了
[root@Mood mood]#
Dockerfile
docker容器
docker VS 虚拟机
docker有二部分组成,一是容器自生,而是依赖于host的内核,可以做到进程隔离。虚拟机可以说是除了本身的运行环境,还完整的虚拟出一个完整的os,再由开发人员再这个os上进行操作,适用于要求制定内核的需求下,因为容器则是共用的host的内核,二者适用的场景不同,但是在服务器资源紧凑的情况下,适用容器技术,可以做到快速发布。其次随着软件发展的迅猛程度来看,开发的使用的组件越来越多,可能会部署在各种各样的环境下,还有每个其开发的服务呢所依赖的也是各不一致,我们发布一次之后,如果遇到环境迁移,比如公有云切到私有云,经典网络切换到VPC网络,这样运维人员岂不是要重新配置一番。容器技术呢正好解决这个痛点,可以吧所要的依赖全部打包到镜像中,不需要根据host做出改变,只要提供了dockerServer之后,就可以使用docker命令将容器启动。