1.入门介绍
1.1 什么是Docker ?
- 使用最广泛的开源容器引擎
- 一种操作系统级的虚拟化技术
- 依赖于Linux 内核特性 : NameSpace 和 Cgroups
- NameSpace 进行资源的隔离
- Cgroups 进行资源的限制
- 一个简单的应用程序打包工具
1.2. 设计目标
- 提供简单的应用程序打包工具
- 开发人员和运维人员职责逻辑分离
- 多环境保持一致性
1.3. docker 简介
Docker Client : 客户端
Docker Daemo : 守护进程
Docker Images : 镜像
Docker Container :容器
Docker Registry :镜像仓库
容器 vs 虚拟机
性能比较
1.4. 应用场景
- 应用 程序的打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
2. Linux 中的 docker 安装
2.1 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
2.2 使用存储库安装
官网安装教程 :https://docs.docker.com/install/linux/docker-ce/ubuntu/
**Step1:安装docker**
sudo apt-get -y update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common**step 2: 安装GPG证书**
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -**Step 3: 写入软件源信息**
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"**Step 4: 更新并安装 Docker-CE**
sudo apt-get -y update
sudo apt-get -y install docker-ce
sudo usermod -a -G docker $USER //更改用户权限sudo gpasswd -a ${USER} docker //将当前用户加入docker 组
sudo service docker start //启动docker
sudo chmod 777 /var/run/docker.sock //进入root操作</kbd>**安装指定版本的Docker-CE:**
Step 1: 查找Docker-CE的版本:
apt-cache madison docker-ce
docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
Step 2: 安装指定版本的Docker-CE: (VERSION 例如 17.06.2~ce-0~ubuntu-xenial)
sudo apt-get -y install docker-ce=[VERSION](从上面找一个版本就可以)查询版本: docker --version
2.3 运行helloworld 测试docker
sudo docker run hello-world
2.4 查看docker 的详细信息
docker info
docker version //查看版本信息
2.5 创建一个容器(简单示例)
docker run -it nginx //启动一个容器
重新打开一个命令行界面。执行下边命令
docker ps //查看所有的镜像
docker images // 查看所有的镜像
docker inspect bfcc4d0a38d1 //通过容器id 查看容器的详细信息,bfcc4d0a38d1是 nginx 的 id ,在 docker ps 可以看到
curl 172.17.0.3 //访问容器
docker exec -it bfcc4d0a38d1 bash // 进入容器
3. 镜像管理
镜像是什么 ?
---- 简单来说,docker 镜像是一个不包含 Linux 内核而又精简的 Linux 操作系统。
镜像从哪里来?
---- Docker Hub 是由Docker 公司负责维护的公共注册中心,包含大量的公共注册中心,包含大量的容器镜像,Docker 工具默认从这个公共镜像下载镜像。
---- https://hub.docker.com/explore
----- 默认为国外的仓库,下载速度较慢,可以手动配置为国内仓库
---- $ vi /etc/docker/daemon.json
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
---- 执行命令 sudo systemctl start docker
----- 查看是否启动 :systemctl status docker
镜像与容器联系 ?
--- 镜像不是一个单一的文件,而是由多层构成,我们可以通过 docker history <ID/NAME> 查看镜像中各层的内容及大小,每层对应着Dockerfile中的一条指令,docker镜像默认存储在 /var/lib/docker/中
----- 容器其实是在镜像的最上边加了一层读写层,在运行容器里做任何文件改动,都会写到这个读写层,如果容器删除了,读写层也会删除了。
---- docker 使用存储驱动管理镜像层内容及读写层的容器层。
docker images //查看所有的镜像 docker history nginx //查看镜像的分层
存储驱动 :
镜像管理命令:
docker image load < nginx1.tar
docker image save nginx > nginx1.tar
du -sh
4. docker 启动与停止
- ----启动 sudo systemctl start docker
- ---- 查看是否启动(状态) :systemctl status docker
- ---- 停止 :sudo systemctl stop docker
- ---- 重启 : sudo systemctl restart docker
- ---- 设置开机启动 :sudo systemctl enable docker
- ---- 查看docker 的信息 :docker info
- ---- 查看docker 的在线官方文档 :docker --help
5. docker 常用命令
5.1 镜像相关命令
1. 查看镜像
-- docker images
---- REPOSITORY : 镜像名称 ,TAG :镜像标签 , IMAGE ID :镜像ID , CREATE :镜像的创建日期 , SIZE :镜像大小。
-----这些镜像都存储在 Docker 宿主机的 /var/lib//docker 目录下
2. 搜索镜像
--docker search +镜像名 // docker search nginx
--- NAME : 仓库名称 , DESCRIPTION : 镜像描述 , STATUS :用户评价,反应一个镜像的受欢迎程度, OFFICIAL : 是否官方, AUTOMATES : 自动构建,表示该镜像由 docker hub 自动构建流程创建的。
3. 拉取镜像
docker pull +镜像名称 // docker pull linuxserver/nginx
4.1 删除镜像
docker rmi 镜像ID // docker rmi f72695d652a2
4.2 删除所有镜像
docker rmi ` docker images -q` //注意,这个引号时esc键下边的键表示的符号。
----- dockers images -q //列出所有镜像的ID。
5.2 容器相关命令
1. 查看容器
docker ps (查看运行中的容器)
docker ps -a (查看所有的容器)
docker ps -l (查看最后一次运行的容器)
docker ps -f status=exited (查看停止的容器)
2. 创建与启动容器
2.1 创建容器命令 docker run
-i : 表示运行容器
-t : 表示容器启动后进入命令行,加入这两个参数后,容器创建就能登录进去,即分配一个伪终端。
--name : 为创建的容器命名。
-v : 表示目录映射关系,(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射, 注意 :最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d : 在run 后边加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加上 -i -t 两个参数,创建后就会自动进入容器)。
-p : 表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个端口映射
(1) : 交互式方式创建容器 : 退出时容器时,容器结束生命。
docker run -it --name=容器名称 镜像名称:标签 /bin/bash 例如 :docker run -it --name=mynginx nginx:1.12 /bin/bash
退出当前容器 : exit
(2) : 守护式方式创建容器(不会切换到docker 终端)
docker run -di --name=zdhnginx nginx:1.12 /bin/bash
如何进入docker 终端 ?
docker exec -it zdhnginx /bin/bash //docker exec -it 容器名称 /bin/bash
即使 执行 exit 命令 退出,并不会退出docker 容器。
3. 停止与启动容器
(1)停止容器
docker stop zdhnginx // docker stop 容器名称(或者容器id)
(2)启动容器
docker start 容器名称 (或者容器id) //docker start zdhnginx
4. 文件拷贝
4.1 将文件拷贝到容器内部,可以使用 cp 命令
docker cp get-docker.sh zdhnginx:home //docker cp 需要拷贝的文件或目录 容器名称:容器目录 也可以用容器ID
4.2 也可以将文件从容器中拷出来
docker cp zdhnginx:/home/get-docker.sh /home/ubuntu/MyGo/ //docker cp 容器名称:/home/get-docker.sh 主机目录
5. 目录挂载
在创建容器的时候,将宿主机的目录与容器的目录进行映射,这样我们就可以通过修改宿主机的某个目录的文件而去影响容器;
--- 创建容器 添加参数 -v 参数,后边为 宿主机:目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=zdh1nginx nginx:1.12
在共享多级目录时,可能出现权限不足问题, 添加 --
6. 查看容器 IP 地址
6.1 通过以下命令查看容器运行的各种数据
docker inspect zdhnginx // docker inspect 容器名称(容器ID),查看容器的详细信息
6.2 执行以下命令直接输出IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' zdh1nginx
7. 删除容器
删除指定容器 :删除容器前必须停止
docker rm zdh1nginx //docker rm 容器名称(容器ID)
6. 应用部署
6.1 MySql 部署
1. 拉去 MySql 镜像
docker pull mysql:5.7
2. 创建容器-p : 代表端口映射 -e : 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登录密码。
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7(拉取的容器镜像)
3. 进入MySQL容器
docker exec -it tensquare_mysql /bin/bash
4. 登录 MySQL
mysql -u root -p
5. 远程登录,连接宿主机IP,指定端口为 33306
6.2 Tomcat 部署
1. 镜像拉取
docker pull tomcat
2. 创建容器(-v : 目录挂载)
docker run -di --name=mytomcat -p 9000:8000 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat
此时,访问 http://140.143.59.4:9000/ ,显示无法访问该页面,因为我们使用了目录挂载,原来的 root 被清空,需要自己部署应用。
6.3 Nginx 部署
1. 镜像拉取
docker pull nginx
2. 创建 Nginx 容器
docker run -di --name=zdhnginx -p 80:80 nginx
6.4 Redis 部署
1. 镜像拉取
docker pull redis
2. 创建容器
docker run -di --name=zdhredis -p 6379:6379 redis
远程连接redis,通过本地的cmd 命令,进入 redis 安装目录,执行下边命令 redis-cli -h 140.143.59.4
-h : 表示连接远程的redis ,若不加 -h ,则只是连接本地的redis
7. 备份与迁移
7.1容器保存为镜像
通过以下命令将容器保存为镜像
docker commit zdhnginx zdhnginx_i
7.2 镜像备份
sudo docker save -o zdhnginx.tar zdhnginx_i // zdhnginx.tar 是导出的文件名 ,zdhnginx_i 是要保存的镜像
7.3 镜像恢复与迁移
sudo docker load -i zdhnginx.tar
8. Dockerfile
Dockerfile 是由一系列的命令和参数构成的脚本,这些命令应用于基础镜像并创建一个新的镜像。
1. 对于开发人员,可以为开发团队提供要给完全一致的开发环境
2. 对于测试人员,可以直接拿开发时构建的镜像或者通过Dockerfile 文件构建一个新的镜像开始工作;
3. 对于运维人员,在部署时,可以实现应用的无缝移植。
8.1 常用命令
8.2 使用脚本创建镜像
1. 创建文件目录
mkdir -p /usr/local/dockerjdk8
2. 将jdk8 的tar包 移动到 dockerjdk8 目录中
sudo mv jdk-8u231-linux-x64.tar.gz /usr/local/dockerjdk8/
3. 进入dockerjdk8 目录
cd /usr/local/dockerjdk8
4.创建 Dockerfile (注意 : D 是大写的,名称必须这样写)
vi DockerFile
FROM centos:7 MAINTAINER Janson WORKDIR /usr RUN mkdir /usr/local/java ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/ ENV JAVA_HOME=/usr/local/java/jdk-8u231-linux-x64 ENV JRE_HOME=$JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
5. 构建镜像
docker build -t='jdk1.8' . // -t 指定构建镜像的名称 . 指定Dockerfile 所在的文件夹
6. docker images 可以查看新构建的镜像
9. Docker 私有仓库
9.1 私有仓库的搭建与配置
1. 拉取私有仓库镜像
docker pull registry
2. 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
3. 打开浏览器输入地址 http://140.143.59.4:5000/v2/_catalog
4.修改 daemon.json (若在另一台机器上下载docker镜像,则需执行下边两个步骤,然后docker pull 140.143.59.4:5000/jdk1.8)
sudo vi /etc/docker/daemon.json
添加以下内容,保存退出
"insecure-registries" : ["140.143.59.4:5000"]
5. 重启docker
sudo systemctl restart docker
9.2 将镜像上传至私有仓库
1. 标记此镜像为私有仓库的镜像
docker tag jdk1.8 140.143.59.4:5000/jdk1.8
2. 启动registry 容器仓库
docker start registry
3. 上传标记的镜像docker push 140.143.59.4:5000/jdk1.8
输入 : http://140.143.59.4:5000/v2/_catalog