0、Docker介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用,所以需要确保Ubuntu的版本是64位。
(docker ce : 社区免费版,docker ee : 企业收费版)
1、Docker安装
安装环境:ubuntu16.04
安装依赖
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
官方地址(需自备梯子,不然速度感人)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
sudo apt-get -y install docker-ce
阿里云镜像源
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
sudo apt-get -y install docker-ce
查看docker版本信息
docker version 或 docker --version
查看docker服务是否启动
systemctl status docker
若未启动,则启动docker服务
sudo systemctl start docker
测试运行hello-world
sudo docker run hello-world
应输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
2、Docker使用
查看docker可用命令
docker
搜索可用docker镜像
sudo docker search 镜像名(如tutorial)
下载容器镜像 (执行pull命令的时候要写完整的名字)
docker pull 用户名/镜像名(如learn/tutorial)
通过docker run命令可以启动某一个镜像,并运行一个命令
docker run命令有两个参数,一个是镜像名,一个是要在镜像中运行的命令
sudo docker run learn/tutorial echo "hello word" # 在tutorial镜像中运行"echo"命令,输出"hello word"
在容器中安装新的程序(如ping)
前面下载的tutorial镜像是基于ubuntu的,所以可以使用ubuntu的apt-get命令来安装ping程序
sudo docker run learn/tutorial apt-get install -y ping # 在learn/tutorial镜像里面安装ping程序
注意:在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。
通过docker commit命令保存对容器的修改
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。
docker commit --help # 查看该命令的参数列表
sudo docker ps -l # 首先获得安装完ping命令之后容器的id,这里为d11c9de3085a
sudo docker commit d11 learn/ping # 然后把这个镜像保存为learn/ping,返回新版本镜像的id号,无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分
运行新的镜像
对一个镜像提交修改之后,就可以运行它里面新安装的命令了
sudo docker run learn/ping ping www.baidu.com # 在新的镜像中运行 ping www.baidu.com 命令
一直运行learn/tutorial镜像里的/bin/bash程序
sudo docker run -it learn/tutorial /bin/bash # 退出输入 exit
进入一个正在运行中的容器:
sudo docker attach 容器ID # 多敲一下回车
通过 exec 命令对指定的容器执行 bash:
docker exec -it 容器ID /bin/bash
查看已存在的所有镜像
sudo docker images
查看已存在的所有容器
sudo docker ps # 查看所有running状态的containers
sudo docker ps -a # 查看所有的containers
sudo docker ps -l # 查看最新创建的container
停止一个运行中的容器:
sudo docker stop 容器ID
先删除容器(删除前需要保证容器是停止的 stop)
sudo docker rm 容器ID # 返回删除容器的ID
再删除镜像
docker rmi 镜像ID
利用docker cp进行容器与主机之间的数据拷贝
sudo docker cp <dir_or_file> 容器ID:/xxx/ # 在主机运行
3、Dockerfile
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。
COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
## 以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
## 如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
COPY test.txt /mydir/
docker build 命令用于使用 Dockerfile 创建镜像。(在 Dockerfile 文件的存放目录下,执行构建动作。)
docker build -t <image_tag> . # --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
最后的 . 代表本次执行的上下文路径。上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
docker tag : 标记本地镜像,将其归入某一仓库。
docker tag ubuntu:16.04 alan/ubuntu:v3 # 将镜像ubuntu:16.04标记为 alan/ubuntu:v3 镜像。
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login -u 用户名 -p 密码 # 登陆到Docker Hub
docker login xxx.xxx.com --username alan --password abcd1234
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push alan/ubuntu:v3
docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout # 登出Docker Hub
参考:
Install Docker Engine on Ubuntu
https://www.cnblogs.com/liuyublog/p/9099410.html