欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker安装及使用

程序员文章站 2022-06-03 10:38:53
...

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

阿里云版加速器

docker安装及使用docker安装及使用

docker安装及使用

查看容器信息

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 <aaa@qq.com>" 

LABEL maintainer="aaa@qq.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/

docker安装及使用


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	->	构建镜像	->	创建容器运行
相关标签: JavaStudy docker