一、Docker Overview
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
首先Docker是容器技术的一种实现,那么什么是容器?
- 可与运行在很多主流操作系统之上,一个操作系统上可以运行多个容器
- 共享同一个OS Kernel
- 应用之间容器之间相互隔离
- 对软件及其依赖的标准化打包
容器和虚拟机有什么区别?
- 容器是APP层面的隔离
- 虚拟机是物理资源层面的隔离
二、Download and install Docker
For Docker Desktop installation instructions, see Install Docker Desktop on Mac and Install Docker Desktop on Windows.
三、Docker Image
Docker Image
Ubunts Image、Cent Os Image、 Debian Image都是Base Image
- Docker Image文件和meta data的集合
- Docker Image是分层的,每一层可以添加和删除文件,从而形成一个新的Image
- 不同的Image可以共享相同的layer
- Image本身是Read-Only的
安装完成后启动Docker
sudo systemctl start docker 复制代码
查看docker版本
docker version 复制代码
查看镜像列表
sudo docker image ls 复制代码
获取Image\
获取Image前先给用户授权,输入docker命令前不需要再加sudo
sudo groupadd docker sudo gpasswd -a vagrant docker # 重启docker服务 sudo service restart docker.service # 退出客户端 exit # 重连客户端 vagrant ssh # 查看docker版本 docker version 复制代码
从docker hub中拉取image,DockerHub类似Github,上面保存了各种build之后的镜像,可以通过docker pull命令直接拉取镜像
docker pull ubuntu:14.04 docker pull bitnami/wordpress 复制代码
Build一个Docker Image
从0构建一个Image,首先pull也hello-word镜像并运行该镜像
docker pull hello-world docker run hello-world 复制代码
hello-world镜像运行后会打印出hello world,然后就自动退出了。
制作一个hello-world镜像,首先准备一个.c文件
#include<stdio.h> int main(){ printf("Hello,Docker;This is your first Image\n") } 复制代码
接着在Docker命令行中开始制作hello-world镜像
mkdir hello-world cd hello-world # 创建一个C文件,内容见下面一个代码块 vi hello.c # 编译二进制文件 # 首先安装工具 sudo yum install gcc sudo yum install glibc-static gcc -static hello.c -o hello # 执行程序 ./hello # 创建dockerfile,内容见dockerfile代码块 vim Dockerfile # build镜像 docker build -t jingnan/hello-world . # 查看镜像 docker images # 查看image分层 docker history jingnan/hello-world # 运行容器 docker run jingnan/hello-world 复制代码
Dockerfile内容
FROM scratch ADD hell0 / CMD ["/hello"] 复制代码
四、Docker Container
Docker Container是
- 通过Docker Image创建出来
- 在Image layer上建立一个Container layer(可读写) Image 负责app的存储和分发,而Container是负责运行App的,两者的关系就像面向对象中的类和实例,一个Image可以启动多个容器,但是容器名称不能相同
Container 命令
# 列举正在运行的容器,也可以使用docker ps docker container ls # 列举出所有的容器,包含已经退出的容器 docker ps -a docker container ls -a # 运行容器,运行之后会立即退出 docker run centos # 查看container列表,不包含刚刚运行的centos docker container ls # 交互式运行容器,添加参数 -it 进入到容器中,可以在容器中进行操作 docker run -it centos # 再次查看running的容器,包含了centos docker container ls # 删除容器,可以只写部分ID docker container rm <ContainerID> # 删除所有容器, -q参数表示只列举出ID docker container rm $(docker ps -a -q) # 列举已经退出的容器 docker container ls -f "status=exited" -q # 删除已经退出的容器 docker rm $(docker container ls -f "status=exited" -q) # 删除镜像 docker image rm <imageID> 复制代码
容器操作:stop delete run
exec:exec表示对容器执行一个命令, exec /bin/bash 表示进入容器中,查看运行状态
--name: 常见容器时,给容器一个自定义的名字
inspect:显示container的详细信息
logs: 查看容器产生的日志
# 启动容器 docker start d7 # 执行 /bin/bash,进交互界面 docker exec -it d7 /bin/bash exit # 执行python命令,进入python shell界面 docker exec -it d7 python exit() # 执行查看ip的命令 docker exec -it d7 ip a docker stop d7 docker rm $(docker ps -a -a) # 重新创建一个新的容器,并添加--name参数,给容器一个自定义的名字 docker run -d --name=demo jingnanjia/flash-hello-world docker inspect docker logs 复制代码
构建私人Docker镜像
首先认识两个命令
# 基于容器,做了一些改变,如安装一些软件,再创建一个新的镜像 docker container commit # 从Dockerfile build一个Image,从基础Image开始 docker container build 复制代码
COMMIT实践:基于centos容器构建一个新的Image
docker image ls # 运行centos,并进入centos交互界面 docker run -it centos # 对centos容器做一些更改,安装vim,并退出 yum install vim exit # 将container构建成一个镜像,stupefied_hertz是容器的名字,stupefied_hertz是新景象的名字 docker commit stupefied_hertz jingnan/centos-vim # 查看镜像构建历史 docker hisoty jingnan/centos-vim 复制代码
Dockerfile实践
mkdir docker-centos-vim cd docker-centos-vim vim Dockerfile # 构建镜像,构建过程中会生成一个临时Container,在临时Container做了操作后再build docker build -t jingnan/centos-vim-new . # 查看镜像列表 docker images 复制代码
Dockerfile内容
FROM centos RUN yum install -y vim 复制代码
Dockerfile之FROM关键字的语法
- FROM是Dockerfile最开头的语法
- FROM scratch表示从0开始构建一个Image
- FROM 尽量使用官方的Image
Dockerfile之LABEL关键字的语法
LABEL类似代码中的注释,如
LABEL maintainer="stark@stark-industry.com" LABEL veresion="mark-50" LABEL description="This is description" 复制代码
Dockerfile之RUN关键字语法
RUN表示运行一些命令,每执行一次RUN,Image都会增加一层,如果需要执行多条命令使用&&连接两条命令,命令过长使用\换行
RUN yum update && yum install -y vim\ python-dev RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME' 复制代码
Dockerfile之WORKDIR关键字语法
WORKDIR作用是设定当前工作目录,要尽量使用绝对目录
WORKDIR /root WORKDIR /test # 如果没有则会自动创建 复制代码
Dockerfile之ADD、 COPY
将本地文件添加到image文件里面,COPY由于ADD,ADD还可以解压
ADD hello / COPY hello test/ 复制代码
Dockerfile之ENV
ENV命令用来设置常量
ENV MYSQL_VERSION 8.0 复制代码
ENTRYPOINT语法实践
mkdir cmd_vs_entrypoint cd cmd_vs_entrypoint # dockerfile内容如下 vim Dockerfile docker build -t jingnan/centos-entrypoint-shell . docker images # 运行镜像,打印出hello Docker docker run jingnan/centos-entrypoint-shell # 修改为EXEC格式, docker build -t jingnan/centos-entrypoint-exec . docker images # 打印出 hello $name docker run jingnan/centos-entrypoint-exec # 修改Dockerfile,再次build vim Dockerfile docker build -t jingnan/centos-entrypoint-exec-new . docker run jingnan/centos-entrypoint-exec-new 复制代码
Shell格式的Dockerfile
FROM centos ENV name Docker ENTRYPOINT echo "hello $name" 复制代码
EXEC格式的Dockerfile,exec格式无法识别$name
FROM centos ENV name Docker ENTRYPOINT ["/bin/echo", "hello $name"] 复制代码
修改exec格式Dockerfile
FROM centos ENV name Docker ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"] 复制代码
五、Docker Image发布
镜像发布实践:首先要有dockerhub的用户名密码
# 输入dockerhub用户名密码 docker login # push的镜像的命名一定包含docker hub用户名 docker push jingnanjia/hello-world # 删除本地镜像,再从dockerhub上拉取自己的镜像 docker rmi jingnanjia/hello-world docker pull jingnanjia/hello-world 复制代码
这样发布Image没有Image构建构成,Image是否安全大家都不清楚
推荐的发布方式:分享Dockerfile
构建一个私有的DockerHub,没有图形界面,可以通过restapi验证镜像是否上传成功
docker run -d -p 5000:5000 -restart always --name registry registry:2 # 构建可以上传到私有仓库的镜像,镜像tag必须是ip:port/name docker build -t 101.133.232.238:5000/hello-world . # 信任私有仓库配置 sudo ls /etc/docker # { "insecure-registries":["101.133.232.238:5000"] } vim /etc/docker/daemon.json # 添加一行 EnvironmentFile=-etc/docker/daemon.json sudo vim /lib/systemd/system/docker.service sudo service docker restart docker push 101.133.232.238:5000/hello-world 复制代码
成功推送到私有仓库