起因

本文背景操作系统:Ubuntu 16.04

今天上课就不想听老师的,就想写下自己之前没搞懂的docker,基本都是看的网上教程和官方文档

认识docker

官方文档:https://docs.docker.com/get-started/

优秀博客:https://zhuanlan.zhihu.com/p/22403015

我这里主要根据官方文档记录下学习过程

什么是docker

上面那篇知乎文章写的很好,详细解释了什么是docker,以及和虚拟机的区别,我这里还是给自己增强下记忆。

虚拟机是模拟抽象出了硬件,然后在虚拟出的硬件上运行新的内核系统,所以虚拟机机开机慢(包括开机自检,启动操作系统等等)

docker 我们可以理解成一个特别的进程,通过linux fork出来的一个进程,(fork出来的父进程和子进程都是一样的),然后运用各种隔离形成‘独立进程’(这个可以看些知乎那篇文章),docker不用安装其他操作系统,也不需要模拟kernel ,用的是本机的kernel 。

总结一下

docker 就是隔离了除内核资源外其应用层资源的进程,docker镜像的kernel和运行docker的kernel是同一个。

安装使用docker

https://docs.docker.com/install/linux/docker-ce/ubuntu/
直接上官方文档,比我讲的清楚

新建docker

1,新建文件夹

找个合适的目录新建个文件夹,例如我这在/home/c/下新建dockertest空文件夹。

2.创建dockerfile文件

这个是创建docker 镜像做重要的东西,主要包括你这个镜像的工作环境。我这里给官方文档解释下

# 每一个dickerfile都必须要一个FROM键,后面这些都是建立在这个'系统'上的,这些都是可以到`docker hub`上找到的
FROM ubuntu

# 这个是镜像的运行目录
WORKDIR /app

# Copy the current directory contents into the container at /app



# 这是创建镜像的时候会执行的命令,主要是用于初始化docker环境
RUN apt update
RUN apt install -y nginx

# 将本目录下的的index.html拷贝到镜像的/var/www/html里面去
COPY ./index.html /var/www/html
# 暴露80端口
EXPOSE 80

# 创建一个环境变量
ENV NAME World

# Run app.py when the container launches
ENTRYPOINT ["/usr/sbin/nginx","-g", "daemon off;"]

这里关于dockerfile键网上很多总结的,我就不说了。。。

3. 创建一个镜像的文件

在本目录创建一个index.html 内容随意乱写都可以

4. build一个镜像

docker build --tag=friendlyhello .

注意命令最后的 . 运行后可以看到命令行执行步骤,一步一步在创建镜像,创建好后客户以使用docker ps -a 查看全部镜像。可以说我们的镜像就做好了。。。

使用别人的镜像

使用docker的search功能,搜索一个自己需要的镜像,会有很多结果,我们找到自己需要的,使用docker pull可以部署到本地,然后我们机可以run这个镜像,使用别人搭好的环境咯,下面用个安装bwapp案例解释:

docker安装bwapp案例

# 搜索一个名为bwapp的镜像
docker search bwapp
# pull到本地
docker pull raesene/bwapp
# 运行镜像,镜像80端口映射宿主的4000端口,宿主的/var/www/html映射到镜像的/var/www/html/aaa里面去
docker run -d -p 4000:80 -v /var/www/html:/var/www/html/aaa raesene/bwapp
# 列出现在运行的镜像
docker ps
# 创建一个新进程进入正在运行的bwapp镜像,可以修改文件
docker exec -it ae3cef6a40f5 bash
# 推出后关闭这个进程,但是bwapp镜像还在运行 
exit
# 停止镜像
docker container stop ae3cef6a40f5
# 删除镜像
docker rmi  ae3cef6a40f5

删除镜像了解下

1.停止所有的container,这样才能够删除其中的images:

docker stop $(docker ps -a -q)

如果想要删除所有container的话再加一个指令:

docker rm $(docker ps -a -q)

2.查看当前有些什么images

docker images

3.删除images,通过image的id来指定删除谁

docker rmi <image id>

想要删除untagged images,也就是那些id为<None>的image的话可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要删除全部image的话

docker rmi $(docker images -q)


Docker  

docker hub

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!