Docker学习笔记
0x01 Docker命令总结
- 使用
docker stop $CONTAINER_ID
来终止正在运行的容器.
查看id,可以使用docker ps -a
来查看所有容器.
docker ps
只能查看正在运行的容器 - 交互式docker
docker exec -it 容器ID /bin/bash
- 重新启动已经停止的容器
docker start 容器id
。 Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行。 - 自动重启容器。
由于某种错误导致容器停止运行,还可以通过–restart标志,让docker自动重启。
docker run --restart=always --name test -d ubuntu /bin/bash -c "echo hello"
无论容器的退出代码是什么,Docker都会重启。
- 获取容器的信息。
docker inspect 容器id/容器name
- 删除所有容器
docker rm 'docker ps -a -q'
-q标志表示只返回容器的ID不返回容器其他信息。 - 拷贝本地文件到容器
docker cp 本地路径 容器长ID:容器路径
- 重启docker服务
sudo service docker restart
- 查看docker的日志
docker logs --tail="10" 容器名称
- docker日志重定向
docker run --log-driver="syslog"
- docker 守护 进程
docker run -d --name test_1 ubuntu
-d就是后台运行,–name就是为容器命名。 - 查看容器内的进程信息。
docker top 容器名
- 查看当前镜像列表
docker images
- 删除一个或者多个镜像
docker rmi images
- 删除容器
docker rm 容器ID
- 拉取镜像
docker pull
- 查找镜像
docker search
- 查看镜像构建过程
docker history 镜像ID
- 查看docker构建过程
docker history
- 将镜像推送到 docker hub
docker push
- 查看容器的端口映射情况
docker port 容器ID 或者 docker port 容器名称
常用例子
用Dockerfile 构建镜像
- Dockerfile文件内容
# Version:0.0.1 注释
FROM ubuntu:14.04 #第一条必须是FROM 指定一个存在的镜像(被称为基础镜像)
MAINTAINER Tri0mphe7 #作者是谁
RUN echo 'hello Test' > /usr/share/nginx/html/index.html
EXPOSE 80
通过 sudo docker build -t="tri0mphe7/test1:v1 ."
构建新的镜像. -t 选项设置仓库和名称 v1表示标签
**最后有一个. 表示当前目录. **
docker build 语法 docker build [OPTIONS] PATH | URL | -
- 通过
docker build --no-cache
忽略Dockerfile构建缓存
挂载卷到容器
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website \
username/nginx nginx
创建一个名为website的容器。-v 选项,v是volume。将宿主机的目录作为卷挂载到容器中去
导入镜像到本地
dokcer load : 导入镜像到本地
docker load [OPTIONS]
docker load -i test.tar
将test.tar导入到本地镜像
知识点
0x01 简单知识点
- Docker 是C/S架构。
- Docker 用Registry来保存用户构建的镜像。 分为公有和私有。 公有Docker公司运营的公用叫做Docker Hub。
- 镜像是Docker生命周期中的构建和打包阶段,而容器是启动和执行阶段。
- copy-on-write技术,写时复制技术,COW技术。刚开始所有用户共享一块内存,当用户读取时,不发生改变,直接读取数据。当某一用户写入时,会新建一块内存将这一用户的数据写入,并且此用户指向新的内存地址,其他用户不变。
- Docker Hub中有两种类型的仓库:用户仓库和顶层仓库。 用户仓库用户自己创建,顶层仓库Docker内部维持。
- 不推荐使用commit创建镜像。
- 使用Dockerfile创建镜像。
FROM
指令指定一个已经存在的镜像,后续指令都将基于该镜像进行。 - docker run命令 -p 表示docker在运行时后应该向外部公开那些网络端口。-p 8080:80 表示将容器的80端口绑定到宿主机的8080上,也就是我们访问宿主机8080相当于访问docker80端口.
0x02 用Dockerfile创建镜像
基于Dockerfile构建新镜像
docker build -t="仓库名/镜像名:标签名"
忽略Dockerfile的构建缓存
docker build --no-cache -t="仓库名/镜像名:标签名"
- CMD 指令
CMD指令用于指定一个容器启动时要运行的命令. RUN指令时指定镜像被构建时要运行的命令.
使用 docker run
后面跟的指令可以覆盖CMD指令.
CMD指令推荐使用数组的方式. 如 CMD ["/bin/bash","-l"]
- ENTRYPOINT 指令
与CMD类似. docker run
命令行中指定的任何参数都会被当做参数传递给ENTRYPOINT指令中指定的指令.
- WORKDIR 指令
从镜像创建新容器时设置工作目录, ENTRYPOINT和CMD指定程序在工作目录下执行.
sudo docker run -ti -w /var/log ubuntu pwd
-w 标志可以在运行时覆盖工作目录
- ENV
镜像构建过程中设置环境变量。可以使用-e在docker run
命令中传递环境变量,这些变量只会在运行时有效。
docker run -it -e "WEB_PORT=8080" ubuntu env
- USER
指定该镜像以什么用户运行. 如果不通过USER指定用户,默认为root。
docker run命令中通过 -u标志来覆盖。
- ADD
用来将构建环境上下文的文件和目录复制到镜像中。
ADD software.lic /opt/app/software.lic
ADD在处理本地归档文件(tar archive)时还有一些小魔法。如果将一个归档文件(gzip,bzip2)为源文件,Docker会自动将归档文件解开(unpack)。
- LABEL
LABEL指令用于为Docker镜像添加元数据。
LABEL type="data" role="admin"
- ONBUILD
能为镜像添加(trigger)。当一个镜像被用做其他镜像的基础镜像时,该镜像的触发器就会执行。
ONBUILD ADD . /var/www
0x03 RUN,CMD和ENTRYPOINT的区别
- RUN命令执行命令并创建新的镜像层,通常用于安装软件包
- CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被
docker run
命令后面的命令行参数替换 - ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行
docker run
时指定了其他命令)
0x04 docker run -p/-P 区别
- 使用 -P 标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口。
- -p (小写)
# hostPort:containerPort
docker run -p 8800:80 webapp /bin/bash
#将容器内80端口映射到主机8800端口
# ip:hostPort:containerPort 映射指定地址的指定端口
0x05 --volumes-from
docker run -d -P --volumes-from james_blog jamtur01/apache
标志 --volumse-from 把指定容器里的所有卷都加入到新创建 容器里。这意味着新创建的apache容器可以访问 james_blog 容器里的所有卷。
Docker Registry
1、什么是Registry
一个registry是一个存储和内容交付系统,其中维护着若干命名的Docker镜像,用户使用
docker push
和docker pull
命令和registry进行交互。
1.1、镜像命名
docker pull ubuntu
指示docker从官方Docker Hub中拉取一个名字为ubuntu的镜像。
这条命令其实是docker pull docker.io/libary/ubuntu
的简写。
docker pull myregistrydomain:port/foo/bar
指示docker拉取位于myregistrydomain:port
的镜像
2、部署registry server
2.1、运行基于容器的Registry
#运行一个本地的registry
docker run -d -p 5000:5000 --name registry Registry:2
2.2、常用命令
# 启动registry
docker run -d -p 5000:5000 --name registry registry:2
# 从Docker Hub上拉取镜像
docker pull ubuntu
# 给镜像打tag
docker image tag ubuntu localhost:5000/myfirstimage
# 推送至你自己的registry
docker push localhost:5000/myfirstimage
# 再次从你自己的registry拉取镜像
docker pull localhost:5000/myfirstimage
# 停止registry并删除所有数据
docker container stop registry && docker container rm -v registry