docker入门

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42614414/article/details/93046403

一、简介

1、docker是什么?

Docker 是世界上领先的容器软件平台,用户可以方便地创建和使用 Docker,把自己的应用放入 Docker 容器中来运行。

Docker 的镜像还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 三个基本概念:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker 三个关键动作:Build、Ship、 Run。

  • Build(构建镜像):镜像就像是集装箱,包括文件以及运行环境等等资源
  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
  • Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方

以上内容部分引自:《Docker 技术入门与实战》

2、为什么要用docker?

  • 一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
  • 更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 隔离性:避免公用的服务器,资源会容易受到其他用户的影响。
  • 弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力。
  • 迁移方便:可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
  • 持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。

3、docker的运行原理是怎样的?

在这里插入图片描述
1. docker build:客户端通过build dockerFile文件,
2. docker pull
3. docker run

二、基础

1、镜像

a、镜像是什么?

百度百科定义:一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
那在docker中的镜像定义是什么?

docker镜像由一层层文件系统构成,它提供了一个基本环境,开发者可以通过dockerFile文件安装、配置软件,它包含容器所需的数据,只读、独立。如果把容器是java中的实例,那镜像就是java中的类。

一系列文件的综合体,比如一个Myaql、tomcat等,都可以作为一个镜像。

b、镜像有什么特点?

除了最上层可编辑外,其余都为只读。

c、常用操作

  1. 查看镜像:docker images
 比如:[root@izbp1brxlqiewfclxxgnvxz ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jpress                         latest              0b70ebd1f136        6 days ago          385MB
hub.c.163.com/library/mysql    latest              9e64176cd8a2        2 years ago         407MB
  1. 拉取镜像:docker pull +镜像名称:版本。
比如:[root@izbp1brxlqiewfclxxgnvxz docker]# docker pull hub.c.163.com/library/hello-world:latest
latest: Pulling from library/hello-world
7a9d05de7670: Pull complete 
Digest: sha256:7391d42f476e10480a3da94f15233703f6c6abcd9b5165e390121f867039a6df
Status: Downloaded newer image for hub.c.163.com/library/hello-world:latest
**常用公用镜像中心** 网易镜像中心:https://c.163yun.com/hub#/m/library/
有两种镜像:鲸鱼图标(docker官网同步过来的);云朵图标(网易蜂巢改动后的)

在这里插入图片描述

  1. 创建镜像:docker build -t 镜像名称:tag .
比如:docker build -t jpress:latest .
解释:
-t 给镜像命名
tag 镜像版本
.  在当前目录构建镜像
**其他知识点**
在创建镜像前,需要你编写dockerFile文件,dockerFile相当于镜像的设计图,通过docker build创建镜像。
下面演示一个简单的dockerFile
from hub.c.163.com/library/tomcat

MAINTAINER guxiaodong gxd683@126.com

COPY jpress.war /usr/local/tomcat/webapps
指令解读
1. from --镜像来源
2. MAINTAINER -- 作者
3. COPY 将当前文件夹下的jpress.war文件 拷贝到 /usr/local/tomcat/webapps目录下
  1. 删除镜像:docker rmi 镜像ID
注意点:
如果该镜像已经运行为容器,将无法删除,会报错:
[root@izbp1brxlqiewfclxxgnvxz docker]# docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 13bfec73cd63 is using its referenced image fce289e99eb9
解读:必须删除container 13bfec73cd63才能删除镜像,否则就要强制删除

[root@izbp1brxlqiewfclxxgnvxz docker]# docker ps -a  --查找所有容器  
13bfec73cd63        hello-world                    "/hello"                 9 days ago          Exited (0) 9 days ago                              kind_blackburn

[root@izbp1brxlqiewfclxxgnvxz docker]# docker rm 13bfec73cd63  --删除容器13bfec73cd63  
13bfec73cd63

[root@izbp1brxlqiewfclxxgnvxz docker]# docker rmi fce289e99eb9  --根据镜像ID删除镜像
Untagged: hello-world:latest
Untagged: hello-world@sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3

5、运行镜像成为容器 docker run [options] 镜像名称

比如:[root@izbp1brxlqiewfclxxgnvxz docker]# docker run -d -p 8997:3306 -e MYSQL_ROOT_PASSWORD=gxd666 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql
参数解读:
1. -d  后台运行
2. -e 环境参数
	1. MYSQL_ROOT_PASSWORD 密码
    2. MYSQL_DATABASE  数据库
4. -p 8997:3306(小写)  把镜像启动的端口()映射到linux机的端口()

2、容器

  1. 容器是什么?
    代码运行的地方,如果把镜像比作java中的类,那容器就是java中的实例
  2. 容器的特点
    1. 隔离性:容器之间彼此独立,互不干扰
    2. 分层:最上层可写,其余都为只读
  3. 如何实现的?
    linux联合文件系统:将不同文件挂在同一个目录下
  4. 常用指令
    1. 查看容器
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker ps  --查看正在运行的容器
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker ps -a --查看所有容器
    
    1. 停止或启动容器
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker stop e54942124b53
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker start e54942124b53
    
    1. 删除容器
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker rm e54942124b53
    
    1. 进入容器:docker exec [-option] containerId [command] [arg]
    [root@izbp1brxlqiewfclxxgnvxz docker]# docker exec -it 55543ce985bf bash
    参数解释
    	1. -i 即便没有附加也保持stdin打开
    	2.  -t 分配一个伪终端
    root@55543ce985bf:/usr/local# exit --退出容器目录
    

3、仓库

1、仓库是什么?

存放镜像的仓库,分私有仓库和公有仓库,常用的公有仓库有:

https://c.163yun.com/hub#/m/home/ --推荐 速度快
https://hub.docker.com/  --国外 很慢

三、实战

1、nginx

1. docker pull hub.c.163.com/library/nginx:latest  -- 从网易蜂巢拉取镜像
2. docker run -d -p 8990:80 hub.c.163.com/library/nginx:latest  --运行镜像
	1. -d  --后台运行
	2. -p(小写)  --容器开放80端口,映射到服务器的8990端口
3. 输入地址 http://localhost:8990

在这里插入图片描述

2、jpress博客系统

1. 编写dockerFile文件

from hub.c.163.com/library/tomcat

MAINTAINER guxiaodong gxd683@126.com

COPY jpress.war /usr/local/tomcat/webapps

下载jpress

http://www.jpress.io/club/post/116

2. 构建

[root@izbp1brxlqiewfclxxgnvxz docker]# docker build -t jpress:latest .
Sending build context to Docker daemon  92.43MB
Step 1/3 : from hub.c.163.com/library/tomcat
 ---> 72d2be374029
Step 2/3 : MAINTAINER guxiaodong gxd683@126.com
 ---> Running in 45889d779a80
Removing intermediate container 45889d779a80
 ---> 55b2e0b3fec1
Step 3/3 : COPY jpress.war /usr/local/tomcat/webapps
 ---> 90f450e46433
Successfully built 90f450e46433
Successfully tagged jpress:latest

3. 运行容器

[root@izbp1brxlqiewfclxxgnvxz docker]# docker run -d -p 8998:8080 90f450e46433

4. 查看博客
在这里插入图片描述
5. 为博客创建一个mysql数据库

1.docker pull hub.c.163.com/library/mysql:latest  --从网易蜂巢拉取mysql镜像
2.docker run -d -p 8997:3306 -e MYSQL_ROOT_PASSWORD=密码 -e MYSQL_DATABASE=数据库名称hub.c.163.com/library/mysql  --运行镜像

6. 再次回到博客页面,进行安装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用快捷键


 - systemctl start docker --启动docker

4、docker在linux上配置远程访问

1、在/usr/lib/systemd/system/docker.service,配置远程访问。主要是在[Service]这个部分,将其中ExecStart=/usr/bin/dockerd-current替换为:

ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H tcp://0.0.0.0:7654 \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
	  $REGISTRIES

(此处默认2375为主管理端口,unix://var/run/docker.sock用于本地管理,7654是备用端口)
2、将管理地址写入/etc/profile

[root@TK-PMS-187 ~]# echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
[root@TK-PMS-187 ~]# source /etc/profile

3、docker重新读取配置文件,重启docker服务

[root@TK-PMS-187 ~]# systemctl daemon-reload
[root@TK-PMS-187 ~]# systemctl restart docker

4、查看docker进程,发现docker 守护进程在已经监听2375的tcp端口
5、查看系统的网络端口,发现tcp的2375端口的确是docker的守护进程在监听

[root@TH-PMS-187 ~]# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 [::]:2375               [::]:*                  LISTEN      1150/dockerd-curren        

5、IDEA中通过docker插件部署springboot项目

https://www.jianshu.com/p/0dcc2e43963b 
https://www.jianshu.com/p/0dcc2e43963b

其他

  1. docker redis使用
2. docker pull hub.c.163.com/library/redis:latest  --拉去镜像
3. docker run --name some-redis -d redis  运行容器
4. docker exec -it 标号 bash     --进入容器内部的redis
5. redis-cli   --连接redis客户端
6. auth 密码
7. docker安装redis并配置外网可访问和密码 基于Dockerfile的方式  https://blog.csdn.net/java_file_style/article/details/91875703
展开阅读全文

没有更多推荐了,返回首页