最近打算再深入玩玩docker,又回来学一学。
笑死4,5月还在开开心心玩docker,现在一看docker hub直接上不去了。
弄了半天,我还以为我的网络dns又出什么问题了,一看,镜像全给拆啦,哈哈哈哈。😅😅😅😅
插入点,我是发现一直用不了docker search 我以为网络有什么问题。
后面发现就别用docker search了,无论你怎么弄镜像就是搞不定的,墙直接封死了docker hub,search应该是默认去hub上面找的,所以search不到不代表镜像出什么问题了。
只要弄了镜像,能够pull就行。
docker
简单回顾什么是docker:最核心的概念,集装箱。
一个涵盖了运行环境➕具体的软件需求。
以mysql举例,需要运行mysql,最简单的就是:相关的linux内核(运行环境)➕mysql软件(需求)
所以简单一点理解,docker一个集装箱包含了具体的软件以及基本的linux内核。
image && container && repository
镜像(image)与容器(container)比较好理解
可以简单的认为一个是集装箱的文件形态/非运行时态(image)
另外一个就是集装箱的运行形态(container)
仓库(repository)也好理解,就是远程放了一堆images,对他们进行管理,让大家都可以去上面下images
运行一个container
上面针对三者的解释,很容易感知到如果需要运行一个container,至少要有image,有了静态的,才能够动起来。
所以第一步需要获取image,两种方式。
- 去repo那边pull下来
- 自己用dockerfile build一个
pull比较简单,觉得需要啥,直接pull下来就可以了。
docker 里面针对image很看版本,除非是latest才可以省略,否则都不可以省略
docker pull redis[:version]# 查看
docker images
dockerfile 构造
刚上手不太会,就会简单一点的。
一般配置一下字段,文件命名为Dockerfile即可,里面内容:
# 从哪个image继承下来
FROM {image_name}[:version]# 谁发布的
LABEL maintainer='{author_name}'# 拷贝文件到image里面
COPY . ./web-back# 构建image时候直接执行
RUN apt-get update && apt-get install vim -y# 开放端口
EXPOSE 8000
docker build -t {image_name}[:version] {dockerfile_path}
弄完dockerfile 执行上面命令就会生成一个image,dockerfile_path可以写.就在当前目录找dockerfile
dockerfile 最头疼的就是这个copy。特别是这个路径,我是不太理解,但踩了n多雷,我自己的见解是
这个dockerfile在哪里,那个地方就认为是根目录 / 所以你在写copy时候,不能写../xxxxx
,会找不到死活找不到copy文件在哪里
copy 默认文件夹是递归复制
container run
有了image就可以进行执行。
docker run --name {container_alias} -p {run_yourhost_port}:{container_inside_port} -itd {iamge_name}
短短一句话也全是问题…
name比较简单,就是给你接下来的container起个名字,后面执行用名字就可以了,就可以不用container ID
-itd 这个比较烦… 我暂时不是特别懂,-d比较简单,就是直接后台执行,如果不加-d相当于直接进入了容器内部的Linux,加上-d就是后台运行。
-it 文档是说明进行网络连接等等操作。。但我是一般用d执行但有时候容器启动不起来有时候得加it,也是不太懂原理,反正看着操作就行。
然后重量级的就是这个port,表面看着平平无奇,但我感觉内部藏着docker的精髓…
说简单点我觉得就是将container内部的一个port将运行container的主机的port关联起来,将所有访问到这个主机的port全部转发到这个container的port去
- 为什么需要转发?
因为,docker的一个container都涵盖了Linux内核,所以它实际上是一个虚拟机,他有自己的网络,有自己的内部端口,你在container运行的任何东西,实际上都运行在这个内部虚拟机上面。所以任何需要访问这个container里面的服务,你都需进行port关联转发,才能够访问,如果不进行转发,会发现根本访问不到。
一般执行起来之后常用命令
# 查看容器执行状态
docker ps -a# 只返回 container id
docker ps -aq# 停止容器
docker stop {container ID / alias}# 删除容器
docker rm {container ID / alias}# 删除所有容器
docker rm `docker ps -aq`# 进入container
docker exec -it {container ID / alias}