docker学习笔记(不定时更新)

docker学习笔记

标签(空格分隔): docker


官方安装教程:https://docs.docker.com/install/
官方文档:https://docs.docker.com/get-started/
国内镜像:https://www.docker-cn.com/registry-mirror
一篇很好的入门教程:https://www.jianshu.com/p/cf6e7248b6c7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1. 安装

官方安装教程:https://docs.docker.com/install/

1.1 windown

  • windown7安装Docker Toolbox。安装过程中需要翻墙,不能翻墙时可以把 C:\Program Files\Docker Toolbox文件夹下的boot2docker.iso复制到C:\Users\lzy.docker\machine\cache下,然后断开网络,就可以继续安装完毕了,亲测可行!
    • docker Toolbox设置国内镜像方法https://www.cnblogs.com/loveyouyou616/p/6702696.html
  • window10专业版 需要启动Hyper-V功能,然后安装Docker Desktop for Windows

1.2 linux

2. 命令

docker images

docker ps

docker info //查看当前环境

docker port [container_id] //查看容器端口映射

docker start|stop|restart [container_id]

docker save 镜像ID -o 文件 // 将指定的镜像打包(例:docker save ef6a7c98d192 -o /home/wuyongfei/springboot-demo.tar)

docker login -u username -p password //登录镜像仓库

docker pull hub.docker.com/zlxtk/nginx:latest //拉取镜像 [域名]/[用户名]/容器名[:版本号]

docker run -i -t ubuntu /bin/bash
# -i : 启动一个可交互的容器
# -t : 表示使用pseudo-TTY,关联到容器的stdin和stdout
# ubuntu : 表示要允许的容器
# /bin/bash : 启动容器时要允许的命令

# 如果在交互式容器中执行exit命令,整个容器会停止允许。如果需要退出交互且不影响容器允许,可以通过【ctrl+PQ】进行

docker logs [container_id] //查看容器日志
# [container_id]为容器id,是容器启动时生成的,输入命令时只需要输入前3位或前4位就可以,只要能与其他容器区分开

docker kill [container_id] //杀死容器进程

docker run -d -p 80:80 nginx
# -d : 后台允许
# -p : 指定主机和容器的端口映射

docker exec -it [container_id] /bin/bash // 进入容器
# docker exec 命令可以在指定的容器中允许命令

docker commit [container_id] my-nginx //把容器转为镜像,这样my-nginx中就包含了之前的改动,可以通过docker run直接运行

docker search nginx //搜索镜像

# 提交镜像分为两部,先设置tag,再push
docker tag [域名]/[用户名]/容器名[:版本号]

docker push 容器名

docker rmi nginx //删除镜像

docker history [container_id] //查看镜像层信息
docker inspect [container_id] //查看镜像信息

2.1 docker run 详解

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
-d : 即(detached)后台允许,不加就是前台允许
--name : 用容器名指定容器,多用于两个容器间建立link通信
--rm : 容器退出时自动删除容器
--pid=host : 共享主机的pid namespace
--uts="" : UTS可以使容器用主机使用相同的hostname和domain,使用要慎重
--ipc="" : 进程间通信的支持,可以和主机共享
--dns=[]
--net="bridge" : 网络模式,5种,默认bridge.
    none:不适用网络
    bridge:默认,通过veth连接到主机的桥接上
    host:适用主机相同的网络
    container:<name|id>:使用其他容器的网络
    network:使用用户自定义网络(通过docker network create 创建)
--mac-address="" : 设置mac
--net-alias=[]
--ip=""
--ip6=""
--add-host : 在容器中添加ip到host的解析,即设置/etc/hosts文件

--restart : 启动策略
    No:默认,无任何重启操作
    On-failure:当容器的命令返回非0值,即有错时,进行重启
    Always:无论容器处于什么状态,都重启。同时,容器会在daemon启动时,附带自启动
    Unless-stopped:与Always类似,但不会随daemon自启动

CGroups :控制容器资源使用情况,内存、CPU、I/O等,详情见:https://docs.docker.com/engine/reference/run/#specifying-custom-cgroups

# 容器默认在非特权模式下,不能访问任何宿主机的设备。如果需要访问某些设备,就必须使用--privileged参数。如果希望使用某个特定的设备,则使用--device。如使用GPU:
docker run --device=/dev/snd:/dev/snd.. 

--log-driver : 日志驱动
    none:不显示日志
    json-file:默认,通过json保存日志
    syslog:将日志输出到系统日志中,通常在/var/log/message
    gelf:Graylog Extended Log Format(GELF)日志,日志会写入到GELF的收集器中,如Graylog或Logstash
    journald:写入到journald
    fluentd:写入到fluentd
    awslogs:写入Amazon CloudWatch
    splunk:写入到splunk日志收集器中

-v :设置数据卷
    例子:docker run -d -P --name datatest -v /webapp ubuntu //该命令创建了一个名为datatest的容器,同时为其创建了一个/webapp的数据卷,这是数据卷在容器内部的位置,它在主机上的位置可以通过 docker inspect [container_id] 命令查看,是查询结果中的【Mounts】部分,通常在/var/lib/docker下

-v src:des //将主机的src目录映射到容器的des目录,这时就可以在容器中修改主机src目录,这种操作很危险,一定不要把主机根目录映射如容器。    

--volumes-from name //使用name容器的数据卷
    
-e //设置环境变量

2.2 容器网络

docker安装成功后,会自动创建三种网络,可以通过命令:
docker network ls
查看

docker network inspect <net> //查看容器网络详情,<net>为 docker network ls查询出来的网络NAME

#每运行一个容器,都会在全局注册相关的网络信息

#用户可以自定义网络,主要包括三种:桥接网络、Overlay网络、插件网络。

# 桥接网络
系统默认的桥接是docker0
将多个容器隔离在一个新的桥接网络中:
docker network create --driver bridge mynet
docker network inspect mynet
    # 然后可以通过--net属性将容器挂接到mynet中
docker run --net=mynet --rm -it ubuntu
docker network inspect mynet
# 同一个桥接下,形成一个私网,相互间是可以通信的,但这仅限于在同一台主机上。若要跨主机通信,必须使用Overlay网络。

# Overlay网络

3. Dockerfile

# 1. 创建文件夹,并新建Dockerfile
mkdir myimage
cd myimage
vim Dockerfile

FROM ubuntu:14.04
ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list
COPY install.sh /usr/local/src/install.sh
COPY supervisord.conf /usr/local/src/supervisord.conf
 
RUN apt-get  update && \
    apt-get -y install build-essential && \
    apt-get -y install supervisor && \
    cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf && \
    apt-get -y install openssh-server && \
    apt-get -y install git && \
    apt-get -y install vim && \
    apt-get -y install lrzsz && \
    apt-get -y install libxml2-dev && \
    apt-get -y install  pkg-config libssl-dev libsslcommon2-dev && \
    apt-get -y install libbz2-dev && \
    apt-get -y install libcurl4-gnutls-dev && \
    apt-get -y install libjpeg8-dev && \
    apt-get -y install libpng-dev && \
    apt-get -y install libfreetype6-dev && \
    apt-get -y install libmcrypt-dev && \
    apt-get -y install libxslt-dev && \
    apt-get -y install libgmp-dev && \
    apt-get -y install libreadline-dev && \
    ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && \
    bash /usr/local/src/install.sh && \
    adduser --gecos '' --disabled-password chenjiayao && \ 
    echo -e '1111\n1111' | passwd chenjiayao && \
    echo -e '11\n11' | passwd root
 
CMD supervisord -n



# 为什么要在一个RUN里面安装全部软件.这里就要说明一点 : 每执行一个Dockerfile的指令都会让我们的image增加一层只读层.所以,写很多指令的话,我们的image就会有太多的layer.所以尽量要克制命令的个数.

# CMD命令.这里我没有使用默认的bash作为启动命令是因为:如果使用bash作为默认的启动进程之后,当前container就只会有一个进程bash.那么其他的apache.ssh等服务都不会自动启动.*每次运行container都得手动启动这些服务很麻烦.所以这里使用supervisor来管理.配置好supervisor之后,只要启动了supervisor,supervisor就会自动帮我们启动其他进程.比如apache.ssh等等.这样就比较方便.


# 2. build
docker build -t image_name .

# 不要以为最后一个参数是指定Dockerfile所在的目录.这个目录指定的是当前docker编译这个image的工作目录.

要先明白,docker是一个C/S的软件,我们使用powerShell输入命令 .之后命令是被发送到服务端执行,然后返回结果的.这跟MySQL一样.只是我们把客户端和服务端安装在一台主机上.
当我们构建image的时候,执行类似COPY指令,那么把文件拷贝到image中,但是构建文件是在服务端完成的,如何让docker服务端得到拷贝的文件?这里我们就要指定一个docker构建的工作目录了.当构建开始的时候,docker会把工作目录下的所有文件都发送到服务端.然后开始构建.这样子他就可以得到我们要copy到image的文件了.
所以我们构建的时候指定.是想把当前目录下的文件等发送到docker服务端进行构建.只是在上面,我们的Dockerfile正好是放在了docker构建image的工作目录中了.
那么,既然上面的参数不是指定Dockerfile所在的目录.那如果我的机子上有多个Dockerfile的话,那么docker会使用哪个?我编写这个Dockerfile的目的就是希望使用这个Dockerfile.这个不用担心. 如果你在build的时候没有指定使用哪个Dockerfile.默认会使用构建iamge的工作目录下名字为Dockerfile的那个Dockerfile…听着有点晕…如果不想理清楚这些问题.每次构建的时候使用powerShell进入Dockerfile所在的目录下,然后执行docker build image_name .就可以了.

docker的container就是为了某个进程而存在的,这个进程就是CMD所指定的程序.比如:CMD /bin/bash就是启动了bash.当我们退出了bash之后,整个container也就退出了.如果你的CMD写成:CMD service nginx start.你会发现container执行之后就马上结束了.这是因为整个container只是为了service nginx start这条命令而存在的,它不会管你这条命令启动了什么.默认启动的bash正好是一直在前台运行,只有你使用exit命令退出bash的时候才结束bash进程.这个时候container才结束.才会让人有container跟虚拟机差不多的错觉.

dockerfile 指令表

FROM //设置镜像基础,可以有多条,两条FORM指令之间的内容放到一个容器中。
MAINTAINER //设置作者
RUN //编译镜像是允许的脚本,每一条就多一层,所以尽量只写一条
CMD //设置容器启动命令,只能有一条
LABEL //标签
EXPOSE //设置容器暴露的端口
ENV //设置容器环境变量,尽量只写一条,如: ENV NAME=ghosts COUNTRY=China CITY="He Nan"。其他命令中可以用${NAME}读取环境变量
ADD //编译镜像时赋值文件到镜像中。功能比COPY强大,可以下载远程文件。源文件必须在编译目录中,不能用../
COPY //编译镜像时赋值文件到镜像中.源文件必须在编译目录中,不能用../
ENTRYPOINT //设置容器的入口程序,如果有多条只有最后一条生效。
VOLUME //设置容器的挂载卷,尽量写在最后,命令之后修改挂载目录中的文件,会被忽略
USER //设置执行RUN、CMD、ENTRYPOINT的用户名
WORKDIR //设置RUN、CMD、ENTRYPOINT、COPY、ADD指令的工作目录。如果目录不存在,会自动创建。
ARG //设置编译镜像时加入的参数
ONBUILD //设置镜像的ONBUILD指令。子镜像会先执行父镜像的ONBUILD指令。
STOPSIGNAL //设置容器的退出信号量

docker build

docker build [OPTIONS] PATH|URL|-
# PATH是编译镜像的工作目录,Docker Daemon在编译开始时,扫描PATH中的所有文件。切忌使用系统根目录。可以在目录中添加.dockerignore文件,来过滤不需要的文件。

# -f //默认docker会在读取PATH或GIT中的Dockerfile文件,-f可以指定其他路径的文件

# -t //设置镜像标签

# --no-cache //不使用缓存

4. 搭建开发环境

官方推荐的搭建java开发环境教程:https://github.com/docker/labs/tree/master/developer-tools/java/
搭建开发环境的一个例子,还有一些概念的说明:http://dockone.io/article/1714
又一个例子:https://blog.csdn.net/jctian000/article/details/82702166

5. 搭建私有仓库

docker-registry

6. 搭建服务器

6.1 nginx

docker run --name nginx 
    -v D:\libs\docker\nginx\nginx.conf:/etc/nginx/nginx.conf:ro 
    -v D:\libs\docker\nginx\vhosts:/etc/nginx/vhosts
    -v D:\libs\docker\nginx\html:/usr/share/nginx/html
    -p 80:80
    -p 8088:8088
    -d hub.c.163.com/library/nginx:latest
    
docker run --name nginx -v D:\libs\docker\nginx\nginx.conf:/etc/nginx/nginx.conf:ro -v D:\libs\docker\nginx\vhosts:/etc/nginx/vhosts -v D:\libs\docker\nginx\html:/usr/share/nginx/html -p 80:80 -p 8088:8088 -d hub.c.163.com/library/nginx:latest
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章