镜像(Image)
- docker中的Image是由Dockerfile文件build而来(build时通过-t来指定Image的tag,如docker build -t REPOSITORY:tag path/to/Dockerfile,常用的镜像分两种:一种是常驻内存的程序,一种是命令行的工具),也可直接从注册中心(Registry(私有的),用于存储Image)/dockerhub(公开的)直接拉取(docker pull REPOSITORY:tag)。生成/获取的Image可通过docker image ls或docker images查看(REPOSITORY(名称),TAG(标签/版本),IMAGE ID(镜像ID)),最后通过docker run REPOSITORY:tag启动Image
- Dockerfile文件中的每一行对应Image中的每一层(Image是分层的,可通过docker history imageID查看),Image中的每一层通过添加、删除文件可成为一个新的Image
- 不同的Image可共享相同的层(layer)
- Image本身是只读的
不同Base Image(用户空间)(Ubuntu Image/Centos Image/Debian Image)(rootfs)共享Linux Kernel(bootfs)(内核空间),不同Base Image之上又有不同的自定义的Image。具体如下图:
补充:
- dockerhub(类似github)
- 登陆:docker login
- 镜像发布:docker (image) push [OPTIONS] NAME[:TAG] [flags] (不推荐) 或者通过将github(放Dockerfile)与dockerhub(根据关联的Dockerfile自动build成相关Image)关联(推荐)
- 镜像拉取:docker pull
- Registry(私有的dockerhub,无web界面,可通过api访问相关信息)
- 首先在dockerhub上搜索registry
- Run a local registry(在一台远程服务器上创建container,运行起来后相当于一个web服务器,可往里面push/pull镜像 -d 表示后台运行,–name registry 表示指定容器的别名(name)): docker run -d -p 5000:5000 –restart always –name registry registry:2
- 本地机器通过ping及telnet确保可访问到正在运行registry的远程服务器
- 然后重新build镜像(镜像名称为远程服务器的ip:port/REPOSITORY)
- docker push image(push前需依次做如下操作)
- 在/etc/docker目录下的daemon.json中添加配置:{‘insecure-registries’:[‘ip:port’]}
- 编辑docker service的启动文件:sudo vim /lib/systemd/system/docker.service -在[Service]中的ExecStart后面添加如下项:EnvironmentFile=-/etc/docker/daemon.json
- 重启docker服务:sudo service docker restart
- push后的image可通过docker registry api查询或pull来验证
容器(Container)
- 通过Image创建(docker run –memory=200M –cpu-shares=10 –name=test1 Image –cpu1 –vm 1 –verbose –vm-bytes 500M) [说明:–memory限定容器使用的内存 –cpu-shares限定容器使用的cpu],在运行容器时通过指定参数来分配资源
- 在Image Layer(只读层)之上建立(多了)一个container layer(读写层)
- 类比类(Image)和实例(container)
- Image负责app的存储和分发,container负责运行app
常用命令
docker的命令分为Management Commands(管理docker中的对象,如Image、container等)和Commands(提供简单的操作方法)两组
- 查看当前本地正在运行(常驻内存的进程)的容器:
- docker container ls (等价于docker ps)
- 进入运行的container里面查看:
- docker exec -it containerID /bin/bash
- 停止运行中的容器:
- docker (container) stop containerID/name
- 启动停止的容器:
- docker start containerID/name
- 查看容器的详细信息(id/状态/主机/网络等信息):
- docker inspect containerID/name
- 查看容器运行时的日志信息:
- docker logs containerID
- 查看当前本地正在运行的以及退出(停止运行)的容器:
- docker container ls -a (等价于docker ps -a)
- 查看当前本地正在运行的以及退出(quit)的容器的containerID:
- docker container ls -aq
- 交互式运行镜像:
- docker run -it ImageID /bin/bash
- 删除退出的容器:
- docker container rm containerID (说明:docker rm containerID 默认删除container,而docker rmi 删除image对应的ID)
- create a new image from a container’s changes (构建Image-不推荐)
- docker (container) commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] [flags]
- build an image from a Dockerfile(构建Image-推荐)
- docker image build [OPTIONS] PATH | URL | - [flags]
dockerfile
dockerfile中的常见语法(关键字)总结
- FROM(一般用于dockerfile中的开头,尽量使用官方的image作为base image)
- FROM scratch # 制作base image
- FROM centos # 使用base image
- FROM ubuntu:14.04
- LABEL(定义了Image的metadata)
- LABEL maintainer=’’
- LABEL version=’’
- LABEL description=’’
- WORKDIR(切换到某个目录(相当于cd),如果没有会自动创建。说明:1、用WORKDIR,不要用RUN cd;2、尽量使用绝对目录)
- WORKDIR /test # 将当前工作目录切换到/test,如果没有会自动创建test目录
- WORKDIR demo
- RUN pwd # 输出结果为 /test/demo
- ADD and COPY(将本地文件添加到Image里面。说明:1、大部分情况,COPY优于ADD;2、ADD除了COPY还有额外的解压功能;3、添加远程文件/目录请使用curl或wget)
- ADD hello /
- ADD test.tar.gz / # 添加到根目录并解压
- WORKDIR /root
- ADD hello test/ # /root/test/hello
- WORKDIR /root
- ADD hello test/ # /root/test/hello
- ENV(设定环境变量)
- ENV MYSQL_VERSION 5.6 # 设置常量
- RUN apt-get install -y mysql-server=’${MYSQL_VERSION}’ \ && rm -rf /var/lib/apt/lists/* # 引用常量
-
VOLUME and EXPOSE(存储和网络)
- RUN(执行命令并创建新的Image Layer。为了美观,复杂的RUN请用反斜线换行;为了避免无用分层,合并多条命令成一行)
-
RUN yum update && yum install -y vim \
python-dev # 反斜线换行
-
- CMD and ENTRYPOINT(执行命令)
- CMD:1、容器启动时默认执行的命令和参数 (docker run image);2、如果docker run指定了其他命令,CMD命令被忽略 (docker run -it image /bin/bash) ;3、如果定义了多个CMD,只有最后一个会执行
- ENTRYPOINT:1、让容器以应用程序或者服务的形式运行;2、不会被忽略,一定会执行;3、shell脚本可作为entrypoint
- ENTRYPOINT(放命令)与CMD(接收参数)组合可形成带参数的命令行:
- ENTRYPOINT [‘/usr/bin/stress’]
- CMD []
- shell格式的命令及参数
- RUN apt-get install -y vim
- CMD echo ‘hello docker’
- ENTRYPOINT echo ‘hello docker’
- Dockerfile1
FROM centos ENV name Docker ENTRYPOINT echo 'hello $name'
- 构建镜像:docker build -t dockerHubID/centos-entrypoint-shell .
- 运行镜像:docker run dockerHubID/centos-entrypoint-shell
- exec格式的命令及参数
- RUN [‘apt-get’,’install’,’-y’,’vim’]
- CMD [‘/bin/echo’,’hello docker’]
- ENTRYPOINT
[‘/bin/echo’,’hello docker’][‘/bin/bash’,’-c’,’echo hello $name’] - Dockerfile2
FROM centos ENV name Docker ENTRYPOINT ['/bin/bash','-c','echo hello $name']
- 构建镜像:docker build -t dockerHubID/centos-entrypoint-exec .
- 运行镜像:docker run dockerHubID/centos-entrypoint-exec