有时候能用使用容器是一种幸福尤其对于有些需要重复来制造的东西,这里是一个学习的笔记,点滴记录记录下所有的过程.
0X00 安装
由于我用的是ubuntu 所以就不介绍mac或windows的安装方法了,对于linux用户,有两条命令需要输入
sudo wget -qO- https://get.docker.com/ | sh
# -q不显示很多信息 O-直接标准输出文件
sudo usermod -aG docker `whoami`
# whoami代表当前的用户
0X01 常见命令
![docker__base](/img/docker_pic.png)
由于image是在最下层,所以删除的时候要先删除 CONTAINER ID 然后才能删除image id,他们删除的命令分别是rm和rmi
docker images # 查看所有images
docker run -p 8080:80 -d daocloud.io/nginx #-p 端口操作 8080:80 映射docker的80到本地的8080 -d 守护进程的形式启动docker
docker ps # 查看当前已经运行的container
cat index.html
<html>
<h1>docker is fun!</h1>
</html>
docker cp index.html 17add7bbc58c://user/share/nginx/html # cp index.html过去 17add7bbc58c 是container的id :/后接路径这个有点像scp
docker stop 17add7bbc58c #停止 container
docker start 17add7bbc58c #启动 container Start one or more stopped containers
docker 在容器内所做的改动都是临时的,不会被保存的,也就是说上面cp进容器的index.html是无法被保存的,在重新启动docker的时候主页还是会变会去
想保存改动就要在改动完成后,输入docker commit -m "fun内容" 17add7bbc58c new_images 来进行保存更改,实际上就会产生一个新的images,名称就叫做new_images
docker rmi images_id #删除images用
docker ps #显示运行的container
docker ps -a #显示所有的container 包括已经stop的
docker rm container_id #删除container
docker pull 获取image
docker build 创建image
docker run 运行 container Run a command in a new container
0x02 Dockerfile
以下是一个简单的dockerfile 用来重建一个新的image
cat dockerfile
FROM alpine:latest
MAINTAINER ivo
CMD echo 'hello docker'
以上 alpine 是一个极小的linux ,第二行表明作者是谁,第三行是运行一个命令
编写好以后,最好建立一个文件夹,把dockerfile放进去.然后开始构建image 使用的命令如下
docker build -t ivo_docker .
# -t image的标签tags .代表将当前目录里面的内容都加进去,所以最好是单独的文件夹
写一个复杂一些的
FROM ubuntu
MAINTAINER ivo
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80
dockerfile的常见语法
FROM #base image
RUN #执行命令
ADD #添加文件
COPY #拷贝文件
CMD #执行文件
EXPOSR #暴露端口
WORKDIR #指定路径
MAINTAINER #维护者
ENV #设定环境变量
ENTRYPOINT #容器入口
USER #指定用户
VOLUME #mount point
0x03 镜像分层
dockerfile中的每一行都产生一个新层,imge存在以后每个层都是ro只读的,只有当image运行时候产生了container layer(容器层)它才是rw读写的.
0x04 Volume 存储
提供独立
于容器之外的持久化
存储.还可以提供容器间
共享
的数据
实现数据共享非常方便,宿主主机与容器主机之间的数据交互,方便.相当于一个通道
0x05 Volume 操作
本地目录挂载到容器里面
docker run -v $PWD/code:/var/www/html nginx
ps:1.$PWD shell命令中本地当前目录的环境变量
2.nginx的配置文件/etc/nginx/conf.d/default.conf中默认的根路径root是/usr/share/nginx/html,所以此处配置容器中的目标路径是/var/www/html并不能在浏览器中打开本地的index.html,需要更改绑定路径或nginx根路径
3.`:`以前是本地目录,以后是容器里面的目录
docker run -d --name nginx -v $PWD/code:/var/www/html nginx
把当前目录挂在到容器里面去
--name 给这个容器一个名字
-v Volume的意思
docker inspect nginx
可以给出很多信息,inspect
检查的意思.查看Mounts
这项它是把source
里面宿主主机的文件地址给挂在到Destination
里面去.
docker exec -it nginx /bin/bash
这个命令可以进到容器里面去 -it
交互式
容器间挂载
mkdir data
docker create -v $PWD/data:/var/mydata --name date_container ubuntu #创建一个容器使用ubuntu的基础镜像
docker run -it --volumes-from data_container ubuntu /bin/bash #volumes-from 从其他容器挂载,基础镜像ubuntu 用it交互式挂载,运行bash
0x04 Registry 镜像仓库
host 宿主机,真实的机器
image 镜像,可重复使用的软件打包
container 容器,image运行的实例
registry 仓库,远端image的仓库
daemon, 容器的守护进程
clinet, 给守护进程输送命令的
与仓库的交互
docker search whalesay 搜索
docker pull whalesay 拉一个新的过来
docker push myname/whalesay 发过去
国内私有仓库
daocloud 时速云 aliyun
0x06 Registry 操作
在做docker push的时候要先登录,否则会没有权限。登录使用docker login
0x07 docker compose 多容器app
compose下载地址
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-uname -s
-uname -m
-o /usr/local/bin/docker-compose
docker-compose stop 停止所有运行的组件
docker-compose rm 删除所有停止运行的组件
docker-compose build重新构建 它会帮做新镜像,需要手动更新镜像
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等