docker在平时的使用中还是比较常见的,这里简单介绍一下docker以及其使用方法,希望对大家有用。
0x01 初识docker
Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:
并且docker安装容器的操作系统位数和物理机是统一的,也就是说64位操作系统只能使用64位docker容器,docker分为image和容器,一个镜像可以生成多个容器,并且容器的环境是相同的。
0x02 基本指令
参数:
–name 指定容器的名字
–rm 容器运行完毕会自动删除
-i -t 创建一个提供交互式shell的容器。
-d 在后台运行容器,并且打印出容器的ID。
-v 目录挂载 前面的是主机后面的是容器
–privileged 拥有真正的root权限
后面加的是容器刚生成是运行的程序默认是/bin/bash
0x1 容器生成
docker run --name weblogic -i -t centos
上述命令会生成一个名字为weblogic 的交互式容器,默认执行的是/bin/bash,所以会进入交互界面。如果本地没有centos的镜像会从远程下载到本地。
0x2 生成容器时的其他属性
docker run 命令用于生成容器 ,生成容器的属性之后不能再改变
端口映射
一般拥有web服务的容器都进行端口映射,将docker的80端口映射到主机的8000端口
docker run -d -p 8000:80 foo/live /bin/bash
环境变量
在配置mysql docker的时候使用-e参数设置环境变量
docker run --name first-mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
0x3 打开/关闭/附加/删除
docker start id 使上述生成的容器启动
docker stop id 使上述生成的容器关闭
docker exec -it id /bin/bash 附加正在运行的容器
docker attach continer id/name
当重新启动容器时,会沿用创建容器(docker run)命令时指定的参数来运行,可能需要按回车才进入。
这时就已经相当于在容器内部了的shell操作了。如果操作过程中,退出了shell。容器也会随之停止。
exec与attach的区别是当exit容器的时候exec不停止容器,而attach会将容器停止
删除时必须保证容器时关闭的
docker rm name/id 删除指定容器
删除所有镜像
docker rmi $(docker images -q)1
根据格式删除所有镜像
docker rm $(docker ps -qf status=exited)
0x4 压缩/导出/上传
我们用镜像生成了容器,然后我们可以将容器生成镜像,然后将镜像打成压缩包方便导入导出,同时也可以把镜像上传至dockerhub,供别人下载使用
压缩(容器)
我们使用容器 furious_bell,现在要将这个容器保存为一个文件 myunbuntu-export-1204.tar
docker export furious_bell > /home/myubuntu-export-1204.tar
导入
docker import /home/myubuntu-export-1204.tar alias
压缩(镜像)
这里有个基础镜像:ubuntu:12.04,现在要将这个镜像保存为一个文件myubuntu-save-1204.tar
docker save 9610cfc68e8d > /home/myubuntu-save-1204.tar
有点慢,稍微等待一下,没有任何warn信息就表示保存OK。9610cfc68e8d 是镜像ID
导入
docker load /home/myubuntu-export-1204.tar alias
上传至远程仓库
首先拥有一个dockerhub账号
上传之前要登录
docker login
然后输入用户名密码
docker login
docker tag id username/repositoryname:tag
docker push username/repositoryname:tag
关于docker file的编写,有时间再补上
0x3 Dockerfile 编写
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。
首先给个实例
运行指令docker build -t name .
FROM ubuntu:16.04
MAINTAINER 4t10n <act01n@163.com>
ENV DEBIAN_FRONTEND noninteractive
#这里添加更新源
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update -y && \
apt-get install -y apache2 \
vim \
tar \
php7.0-fpm \
php7.0-mcrypt \
php7.0-mysql \
mysql-client \
mysql-server \
&& /etc/init.d/mysql start \
&& mysqladmin -uroot password root \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /tmp
#COPY ./start.sh /tmp/
#COPY ./init.sql /tmp/
#RUN chmod a+x start.sh
#设置数据库
RUN set -x \
&& service mysql start \
&& mysql -e "CREATE DATABASE blog DEFAULT CHARACTER SET utf8;" -uroot -proot \
&& mysql -e "grant select,insert on blog.* to 'admin'@'localhost' identified by 'password' " -uroot -proot
# copy 源码
#COPY ./default /etc/nginx/sites-available/default
#COPY ./src /usr/share/nginx/html/
COPY ./1.php /var/www/html/
# 设置可写权限
RUN chown -R www-data:www-data /var/www/html/
EXPOSE 80 3306
CMD ["/tmp/start.sh"]
贴上一个环境较为完整的docker镜像的dockerfile
FROM ubuntu:16.04
MAINTAINER 4t10n <act01n@163.com>
ENV DEBIAN_FRONTEND noninteractive
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update -y && \
apt-get install -y software-properties-common && \
apt-get install -y python-software-properties && \
add-apt-repository ppa:ondrej/php -y && \
apt-get update -y && \
apt-get install -y apache2 \
vim \
tar \
php7.0-fpm \
php7.0-mcrypt \
php7.0-mysql \
mysql-client \
mysql-server \
php5.6 \
php5.6-fpm \
php5.6-mysql \
php5.6-mcrypt && \
apt-get install -y zsh && \
apt-get install -y git \
&& /etc/init.d/mysql start \
&& sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" \
&& mysqladmin -uroot password root
0x1 FROM
FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。
0x2 MAINTAINER
这里是用于指定镜像制作者的信息
0x3 RUN
RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。
层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。
0x4 ENV
ENV指令可以用于为docker容器设置环境变量
ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run –env =来修改环境变量。
0x5 WORKDIR
WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。
0x6 COPY
COPY 将文件从路径<src>
复制添加到容器内部路径 <dest>
<src>
必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url,<dest>
是目标容器中的绝对路径。
所有的新文件和文件夹都会创建UID 和 GID 。事实上如果<src>
是一个远程文件URL,那么目标文件的权限将会是600。
0x7 ADD
ADD 将文件从路径 复制添加到容器内部路径
同COPY
0x8 EXPOSE
EXPOSE 指令指定在docker允许时指定的端口进行转发。
0x9 CMD
Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。
CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。
当你使用shell或exec格式时, CMD
会自动执行这个命令。