Docker 简明笔记
原理
- 利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
基本命令
- docker version
查看docker的属性 - docker info
查看docker系统层面信息 - docker search ubuntu16.04
搜索镜像 - docker pull ubuntu
下载镜像 - docker run ubuntu /bin/echo hello world
run使用镜像 - docker run -i -t ubuntu /bin/bash
交互使用镜像 - docker run -d ubuntu /bin/bash -c “while true;do echo hello world;sleep 1;done”
以守护态(Daemonized)形式运行 - docker logs CONTAINER_ID
查看容器的运行 - docker ps
查看新镜像 - sudo docker images # 查看镜像相关信息
- sudo docker history {image id} # 查看镜像的操作历史
操作新镜像 - sudo docker run -d -p 80 –name suibianquming chen/wodedaoke nginx -g “daemon off;”
- sudo docker ps -l
- sudo docker port f59e8ccb6f21 80
- sudo docker run -d -p 127.0.0.1:33222:80 –name ceshiduankou chen/wodedaoke nginx -g “daemon off;”
扩展阅读
查看依赖:
uname -a
需要满足64位操作系统,内核版本2.8以上。
ls -l /sys/class/misc/device-mapper
或者
sudo grep device-mapper /proc/devices
显示device-mapper的相关状态。
docker安装
gpg --keyserver pgpkeys.mit.edu --recv-key 9AA38DCD55BE302B
sudo apt-get update
sudo apt-get install docker-engine
sudo apt-get install docker-engine --fix-missing
docker与防火墙
将/etc/default/ufw文件改换:
DEFAULT_FORWARD_POLICY="DROP"
改为
DEFAULT_FORWARD_POLICY="ACCEPT"
然后
sudo ufw reload docker
使用sudo docker run -i -t ubuntu /bin/bash #-i 交互 -t 创建 tty 伪终端
# 如果本地没有这个镜像, docker 会从官方指定的源下载该镜像。
sudo docker run --name bob_the_container -i -t ubuntu /bin/bash # 取一个名字
sudo docker start bob_the_container
sudo docker start 11b5de36fcb8
sudo docker attach bob_the_container # 重新附着到该容器的会话上。
sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" #-d 表示以守护进程的模式进行启动。
sudo docker logs daemon_dave
sudo docker logs -ft daemon_dave
sudo docker logs --tail 10 daemon_dave
sudo docker run --log-driver="syslog" --name daemon_dwayne -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" # 会禁用 docker 的 log 功能并将 log 自动导出到 Syslog
sudo docker top daemon_dave
sudo docker stats daemon_dave
sudo docker exec -d daemon_dave touch /tmp/temptfile # 额外启动新进程
sudo docker stop daemon_dave
docker ps -n 2 # 显示最后两个容器
sudo docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" #restart 的判断模式还可设置为 on-failure:5
sudo docker inspect daemon_dave
sudo docker rm 11b5de36fcb8
sudo docker rm `sudo docker ps -a -q` #-q 表示只返回容器的 ID
sudo docker pull fedora:21
sudo docker search puppet
sudo docker pull jamtur01/puppetmaster
sudo docker images fedora
sudo docker pause container_name
docker深入
当一个容器启动后,它会被移到内存中,而引导文件系统则会被卸载,以留出更多内存提供给initrd镜像用。
联合加载技术
bootfs; rootfs
写时复制;镜像分层框架
用Dockerfile构建镜像
在test文件夹中touch一个文件Dockerfile。内容如下:
#version
FROM ubuntu
MAINTAINER james turnbull "chen@email.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'hi, im in your container' >/usr/share/nginx/html/index.html
RUN ["apt-get", "install", "-y", "sdcv"]
EXPOSE 80
Dockerfile指令
RUN # 指定镜像被构建时候要运行的命令
CMD # 容器启动时候运行的命令
CMD ["/bin/bash", "-l"]
# 命令行中的指令会覆盖 Dockerfile 中的 CMD 指令
# 在 Dockerfile 中只能指定一条 CMD 指令
ENTRYPOINT ["/usr/sbin/nginx"] # 同 CMD ,在容器启动的时候运行
WORKDIR /opt/webapp/db
ENV RVM_PATH /home/rvm RVM_ARCHFLAGS="-arch i386" # 这个新的环境变量可以在后面的任何 RUN 指令中使用。
ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR
# 也有命令行用 -e 传递环境变量。如: sudo docker run -it -e "WEB_PORT=8080" ubuntu env
USER nginx:group # 用 nginx 用戶的身份运行。可以在命令行中用 -e 进行覆盖。
VOLUME ["/opt/project"] # 这条指令会为基于这个镜像的任何容器创建一个文件夹ADD sourcepath/file targetpath/file # 会将外部环境下的当前目录下对应的文件复制到镜像中对应的路径。路径也可用 URL 作为文件源。
ADD http://wordpress.org/latest.zip /root/wordpress.zip # 小魔法:归档文件指定为源文件,在目的路径会自动解压。也会自动创建对应的全路径。
COPY conf.d/ /etc/apache2 # 同 ADD 。只是复制。
LABEL label="value" # 键值对的形式进行展现。可用 docker inspect 进行查看。
STOPSIGNAL SIGKILL # 设置停止容器时发送什么系统调用信号给容器。信号必须合法。
ARG build webapp_user=user # 构建时采用 --build-arg. 运行 docker build --build-arg build=1234 -t chen/images_name
ONBUILD ADD . /app/src # 创建一个触发器。当一个镜像被用作其他镜像的基础镜像时,该触发器会被执行。这些指令是紧 跟在 FROM 之后的。可通过 docker inspect image 或container 进行查看。
如何理解ENTRYPOINT:
在Dockerfile中ENTRYPOINT一个命令,如果外部命令行进行一个操作(该操作和原操作冲突),则该操作不会执行。如果文件内部
ENTRYPOINT的命令没有参数,则外部命令行的参数可作为内部命令的参数。
一次网站的搭建
可以直接运行我的dockernginx.sh脚本。或者代码如下:
#!/bin/bash
#auth cheng
#date 2017-7-26
#install a website with a docker.
sudo docker pull ubuntu
cd ~
mkdir test/sample -p
cd test/sample
mkdir nginx && cd nginx
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/ master/code/5/sample/nginx/gl
obal.conf
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/ master/code/5/sample/nginx/ng
inx.conf
write_dockerfile()
cd ..
sudo docker build -t ubuntu .
images_id = $(sudo docker images | grep ubuntu | awk '{print $3}')
sudo docker history $images_idmkdir website && cd website
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/ master/code/5/sample/website/
index.html
cd ..
sudo docker run -d -p 1010:80 --name website -v $PWD/website:/var/ www/html/website:rw chen/ngin
x nginx #"chen" is porperty's name. "-v" allows us to load host directory as a volume into the
container.
write_dockerfile(){
echo '''
#Create a usual website with docker
#auth cheng
#date 2017.7.26
FROM ubuntu
MAINTAINER chen "chenjiacheng@andlinks.com"
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update && apt-get -yqq install nginx
RUN mkdir -p /var/www/html/website
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
''' > Dockerfile
}