docker安装及使用

1. 简介

互联网时代:高可用、高并发、高性能

高并发最终解决方案:水平扩展(不断增加服务器)docker解决水平扩展部署问题。

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的** Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

为什么用docker:

  • 简化程序:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
  • 节省开支:Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
  • 持续交付和部署:一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
  • 更轻松的迁移: Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。

Docker与虚拟机的区别:

  • 实现原理技术不同 虚拟机是⽤来进行硬件资源划分的完美解决⽅案,利⽤的是硬件虚拟化技术。 而容器则是操作系统级别的虚拟化,通过软件来实现,仅仅是进程本身就可以实现互相隔离。
  • 使⽤资源⽅⾯不同 Docker 容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此更加轻量级, 消耗的资源更少。 虚拟机会独占分配给自己的资源,不存在资源共享,各个虚拟机之间近乎完全隔离, 更加重量级,也会消耗更多的资源。
  • 应⽤场景不同 若需要资源的完全隔离并且不考虑资源的消耗,可以使用虚拟机。 若是想隔离进程并且需要运行 大量进程实例,应该选择 Docker 容器。

2. 架构

基本概念:

  • 镜像Image(相当于类)
  • 容器Container(相当于对象)
  • 仓库Repository

3. 安装

ubuntu上安装

https://docs.docker.com/engine/install/ubuntu/

官方加速器

https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror

注意这里配置后要重启

sudo systemctl daemon-reload
sudo systemctl restart docker

阿里云版加速器

在这里插入图片描述在这里插入图片描述

image-20200506165832778

查看容器信息

sudo docker info

4. Docker镜像

https://hub.docker.com/

查看镜像

docker image ls
docker images	// 两个指令相同

获取镜像

docker pull [选项] [Docker Registey 地址[:端口号]/] 仓库名[:标签]

删除镜像

docker image rm [选项] <镜像1> [<镜像2>.....]
// 用 ID、镜像名、摘要删除镜像 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
// 删除本地镜像
docker image rmi 镜像ID //常用

5. Docker容器

1. 查看容器状态

docker ps //查看运行的容器 
docker ps –a //查看所有的容器(包含运行和退出) 
docker container ls 
docker container ls –a

2. 启动容器

启动容器有二种方式,一种是基于镜像新建一个容器并启动,一种是将在终止状态( stopped )的容器重新启动

docker run 参数 镜像名称:tag 执⾏的命令
-i 保持和 docker 容器内的交互,启动容器时,运⾏的命令结束后,容器依然存活,没有退出(默认是会退出,即停 ⽌的)
-t 为容器的标准输⼊虚拟⼀个tty 
-d 后台运⾏容器 
--rm 容器在启动后,执⾏完成停止命令或程序后就销毁 
--name 给容器起⼀个⾃定义名称 
-p 宿主机:内部端口

3. 停止容器

docker stop 9be696a0c283 //停止正在运行容器(或Ctrl+c) 
docker container stop tomcat1//停止正运行容器(ID或Names)

4. 启动终止容器

docker start 容器名/容器 ID

5. 启动关闭容器

docker restart 9be696a0c283//启动容器(根据ID或NAMES)

6. 关闭删除容器

docker rm 容器ID

7. 进入容器

docker exec -it 容器ID(Names)bash

8. 宿主机与容器交换文件

docker cp [OPTIONS] CONTAINER:PATH LOCALPATH //容器中 复制到 宿主机 
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH //宿主机 复制到 容器中

6. 查看日志

docker logs 容器名称/ID
docker logs -f -t --since="2018-12-1" --tail=10 qfjy_exam
// --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。 
-f : 查看实时日志 
-t : 查看日志产生的日期 
-tail=10 : 查看最后的10条日志 
qfjy_exam : 容器名称

7. Docker数据卷

特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

1.创建

docker volumn create name

2. 查看

docker volumn ls

3. 挂载

docker run --rm -d --name tomcat-8081 -p 8081:8080 
-v /usr/local/docker/qfnj/:/usr/local/tomcat/webapps/qfnj tomcat

// -v /usr/local/docker/qfnj/:/usr/local/tomcat/webapps/qfnj tomcat
-v 数据卷参数。
将宿主机 /usr/local/docker/qfnj/ 文件内的内容信息
挂载在容器 /usr/local/tomcat/webapps/qfnj 目录下

8. 常见安装

1. mysql

docker pull mysql
// 启动
docker run -d --name mysql-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
// 进入容器
docker exec -it mysql-3306 bash
// 登录mysql
mysql -u root -p 
// 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'lianlianjie';
// 设置访问权限允许远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'lianlianjie' WITH GRANT OPTION;
// 刷新访问权限表
FLUSH PRIVILEGES;
// 8.0版本后,设置访问权限允许远程访问
mysql -u root -p
use mysql;
//Mysql默认不允许远程登录,所以需要开启远程访问权限
select user,authentication_string,host from user;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;
//navicat 连接 mysql 出现`Client does not support authentication protocol requested by server`
alter user 'root'@'%' identified with mysql_native_password by 'lianlianjie';

2. redis

docker pull redis;
docker run -d --name redis-6379 -p 6379:6379 redis --requirepass "lianlianjie"
docker exec -it redis-6379 bash //进入redis命令 
redis-cli //开启客户端功能

9. Dockerfile定制镜像

1. 常用命令

FROM
--指定基础镜像
基础镜像不存在会在Docker Hub上拉去(一般会是文件的第一个指令) 使用格式:
FROM <镜像>:[tag] 
FROM <镜像>@digest[校验码] 当前主机没有此镜像时,会自动去官网HUB下载
MAINTAINER
--提供Dockerfile 制作者提供本人信息
[逐渐废弃] LABLE --替代MAINTANIER 具体使用: LABLE maintainer="作者信息"
MAINTANIER "guoweixin <guoweixin@aliyun.com>" 

LABEL maintainer="guoweixin@aliyun.com" 
LABEL "com.example.vendor"="ACME Incorporated" 
LABEL com.example.label-with-value="foo" 
LABEL version="1.0" LABEL description="This text illustrates 
\ that label-values can span multiple lines."
ENV
ENV指令可以用于为docker容器设置环境变量 ENV设置的环境变量,可以使用 docker inspect命令来查看。同
时还可以使用docker run --env =来修改环境变量。
具体用法: 
ENV JAVA_HOME /usr/local/jdk 
ENV JRE_HOME $JAVA_HOME/jre 
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/ 
ENV PATH $PATH:$JAVA_HOME/bin/
WORKDIR
WORKDIR 用来切换工作目录的。
Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每
一个 RUN 都是独立进行的。
如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个
指令前都使用一次 WORKDIR。 
WORKDIR /usr/local/tomcat/
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
--卷
只能定义docker管理的卷: VOLUME /data/mysql运行的时候会随机在宿主机的目录下生成一个卷目录!
COPY
--把宿主机中的文件复制到镜像中去!
文件要在Dockerfile工作目录 src 原文件 --支持通配符 --通常相对路径 dest 目标路径
--通常绝对路径
ADD
类似COPY命令
ADD 将文件从路径 复制添加到容器内部路径 。
必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。
是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID。事实上如果 是一个远程文件URL,那
么目标文件的权限将会是600。
EXPOSE
为容器打开指定要监听的端口以实现与外部通信
使用格式: EXPOSE 80/tcp 23/udp
不加协议默认为tcp
使用-P选项可以暴露这里指定的端口! 但是宿主的关联至这个端口的端口是随机的!
RUN
RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式
有两种: • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就
是这种格式。
• exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。
使用格式: RUN RUN ["","",""]

2. 案例

案例1

需求:创建一个镜像(基于tomcat)里面要有一个index.html,并写入Hello qfnj Docker
1、在宿主机创建一空白目录
	mkdir -p /usr/local/docker/demo1
2、在该目录下,创建一文件Dockerfile
	vim Dockerfile
3、其内容为:
	FROM tomcat //指定tomcat最新版本镜像 
	RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
	这个 Dockerfile 很简单,一共就两行。涉及到了两条指令, FROM 和 RUN 。 
4、构建镜像
	docker build -t demo1 . 
5、运行镜像所在容器
	docker run --rm --name demo1-8080 -p 8080:8080 -d demo1
	访问浏览器即可成功该问
docker build [选项] <上下文路径/URL/-> 
docker build -t demo1 . // . 代表Dockerfile上下文路径

· -t :指定要创建的目标镜像名
· . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

案例2

案例:基于上一个镜像(基于tomcat)将ROOT内多余的文件都删除。只保留index.html
WORKDIR 指定工作目录 的掌握和练习
1 基于如上修改Dockerfile
	FROM tomcat //指定tomcat最新版本镜像 
	WORKDIR /usr/local/tomcat/webapps/ROOT/ //切换到该目录下 
	RUN rm -rf * //将当前目录的文件都删掉 
	RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html WORKDIR 用来切换工作目录的。		而不是用RUN。 
2、 构建镜像
	docker build –t 镜像名 . //Dockerfile上下文路径 
3、查看镜像列表docker images
	如果镜像名称有<none>
4、删除虚拟镜像
	docker image prune

案例3

案例:基于上一个镜像(基于tomcat)外部复制一个文件(图片),并复制到容器中并能访问

1 基于如上修改Dockerfile
FROM tomcat //指定tomcat最新版本镜像 
WORKDIR /usr/local/tomcat/webapps/ROOT/ //切换到该目录下 
RUN rm -rf * //将当前目录的文件都删掉 
COPY 1.png /usr/local/tomcat/webapps/ROOT/ 
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html 
WORKDIR 用来切换工作目录的。而不是用RUN。 

2、 构建镜像
docker build –t 镜像名 . //Dockerfile上下文路径

COPY 格式: 
• COPY <源路径>... <目标路径> 
• COPY ["<源路径1>",... "<目标路径>"] 
和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。 
COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
比如: COPY qfjy.png /usr/local/tomcat/webapps/ROOT/ <目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR指令来指定)。目标 路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。 
此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特 性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。

案例4

实际开发中,利用Dockerfile 将一个war包生成镜像的Dockerfile:

1、docker下创建项目工程名称
mkdir -p /usr/local/docker/qfjy_exam 
cd /usr/local/docker/qfjy_exam

2、将桌面qfjy_exam.zip复制到访目录下
cp qfjy_exam-1.0-SNAPSHOT.zip /usr/local/docker/qfjy_exam/

在这里插入图片描述


3. 部署springboot

Dockerfile

FROM java:8 
VOLUME /tmp 
ADD exam-0.0.1-SNAPSHOT.jar exam.jar 
EXPOSE 8080 
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/exam.jar"]
FROM:表示基础镜像,即运行环境
VOLUME /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使
用/tmp作为工作目录
ADD:拷贝文件并且重命名(ADD exam-0.0.1-SNAPSHOT.jar exam.jar 将应用jar包复制到/exam.jar)
EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人
员告诉容器布署人员容器应该映射哪个端口给外界
ENTRYPOINT:容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启
动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

构建容器

docker build -t exam .

运行容器

docker run --rm -d --name 容器名称 -p 8080:8080 镜像名称

步骤:

录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使
用/tmp作为工作目录
ADD:拷贝文件并且重命名(ADD exam-0.0.1-SNAPSHOT.jar exam.jar 将应用jar包复制到/exam.jar)
EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人
员告诉容器布署人员容器应该映射哪个端口给外界
ENTRYPOINT:容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启
动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT


### 构建容器

docker build -t exam .


### 运行容器

docker run --rm -d --name 容器名称 -p 8080:8080 镜像名称


### 步骤:

打包	->	部署	->	上传到服务器	->	编写Dockerfile	->	构建镜像	->	创建容器运行
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值