Docker学习笔记

一、简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;

运行中的这个镜像称为容器,容器启动是非常快速的。

img

20180303145531

image-20200219180440790

二、核心概念

docker主机(Host):或者称为docker宿主机,即安装了Docker程序的机器。

docker客户端(Client):连接docker主机进行操作的程序。

docker仓库(Registry):用来保存各种打包好的软件镜像,包括公共仓库和私有仓库。

docker镜像(Images):通过docker打包某些软件后生成的镜像(可放在docker仓库中)。

docker容器(Container):某镜像启动后产生的实例称为容器;容器是独立运行的一个或一组应用。

20180303165113

使用Docker的步骤:

(1)安装Docker

(2)去Docker仓库找到这个软件对应的镜像;

(3)使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;

(4)对容器的启动停止就是对软件的启动停止。

三、安装Docker

这里使用centos7安装docker,其他版本linux大同小异。

1
2
3
4
5
6
7
8
9
10
11
12
13
#1、检查内核版本,必须是3.10及以上
$ uname -r
#2、安装docker
$ yum install docker -y
#3、启动docker
$ systemctl start docker
$ docker -v
Docker version 1.12.6, build 3e8e77d/1.12.6
#4、开机启动docker
$ systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
#5、停止docker
$ systemctl stop docker

四、镜像操作

https://hub.docker.com/

1
2
3
4
5
6
7
8
#检索	(去https://hub.docker.com上查看镜像的详细信息。eg:docker search redis)
$ docker search 镜像关键字
#拉取 (name是镜像名,:tag是可选的,tag表示标签,多为软件的版本,默认是latest)
$ docker pull name[:tag]
#列出 (查看所有本地镜像)
$ docker images
#删除 (删除指定的本地镜像,image-id是镜像id)
$ docker rmi image-id

五、容器操作

hell1555649048589

小案例:

1
2
$ docker pull hello-world
$ docker run hello-world

六、案例

步骤:软件镜像(安装程序)—> 运行镜像 —> 产生一个容器(正在运行的软件)。

1. 安装并运行nginx

1
2
3
4
5
6
7
8
9
10
11
12
#拉取(下载)镜像
$ docker pull hub.c.163.com/library/nginx:latest

#根据镜像实例化一个容器并运行,运行好后访问http://192.168.222.131:8080
$ docker run -d --name nginx1 -p 8080:80 nginx

#可以进入容器内部执行命令(里面的文件系统和原生linux的一样)
$ docker exec -it nginx1 bash
#在容器里执行命令查看nginx命令的位置
$ which nginx
#退出容器
$ exit

2. 安装并运行tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#1、搜索镜像
$ docker search tomcat

#2、拉取(下载)镜像
#$ docker pull tomcat
#这里使用的是网易镜像站的,网址:https://c.163yun.com/hub#/home
$ docker pull hub.c.163.com/library/tomcat

#3、根据镜像实例化一个容器并运行
# 选项:-d:表示后台运行;-p: 表示将主机的端口映射到容器的一个端口,如-p 主机端口:容器内部的端口。
# 启动一个做了端口映射的tomcat,假设虚拟机ip为192.168.222.132,那么启动容器后访问http://192.168.222.132:8080
$ docker run -d --name mytomcat -p 8080:8080 hub.c.163.com/library/tomcat

#4、查看运行中的容器
$ docker ps

#5、查看当前所有容器
$ docker ps -a

#6、 停止运行中的容器
$ docker stop mytomcat

#7、启动容器
$ docker start mytomcat

#8、删除一个容器(需要先停止运行中的容器)
$ docker rm mytomcat

#9、查看容器的日志 docker logs container-name或者container-id
$ docker logs mytomcat

更多命令参看https://docs.docker.com/engine/reference/commandline/docker/可以参考每一个镜像的文档

3. 安装并运行mysql

1
2
docker pull mysql
#docker pull mysql:5.7 #指定版本用 :标签(版本号)

正确的启动

1
$ docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

做端口映射的启动方式:

1
2
$ docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#docker run -p 3306:3306 --name mysql5_7 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

错误的启动

1
2
[root@localhost ~]# docker run --name mysql01 -d mysql
#MYSQL_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD;这个三个参数必须指定一个

几个其他的高级操作

1
2
3
4
5
6
$ docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
#改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
#指定mysql的一些配置参数

七、镜像下载加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

1
vim /etc/docker/daemon.json

添加以下内容:

1
2
3
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
1
2
3
4
5
6
#重新加载配制
$ systemctl daemon-reload
#重启docker
$ service docker restart
#检查加速器是否生效
$ docker info

如果方便建议使用aliyun的镜像

地址:https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors

image-20200216144500211

八、构建自定义镜像

方式1:上传程序到vps后构建

需求:构建一个能在tomcat容器里运行的war包程序镜像,并通过镜像创建一个实例容器。

由于依赖于tomcat容器,故需要先拉去tomcat镜像到本地。tomcat镜像主页:https://c.163yun.com/hub#/library/repository/info?repoId=3105

(1)拉取tomcat镜像到宿主机

1
$ docker pull hub.c.163.com/library/tomcat:latest

(2)上传war包

创建一个webdemo项目,并在这个webdemo项目的资源路径里添加一个index.jsp页面。

1
2
3
4
5
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

然后打包得到webdemo.war文件。并上传这个webdemo.war文件到vps的/root/project目录

(3)编写Dockerfile文件

1
2
#在/root/project下编写一个Dockerfile文件
$ vim Dockerfile
1
2
3
4
5
6
#继承于某个镜像
from hub.c.163.com/library/tomcat
#镜像所有者信息
MAINTAINER qcmoke qcmoke@gmail.com
#把程序copy到容器镜像当中,前面的参数是本地路径,后面的参数是容器镜像路径(可以到镜像主页得到tomcat的webapp路径)
COPY /root/project /usr/local/tomcat/webapps

(4)构建生成镜像

1
2
#在Dockerfile文件所在的目录,即/root/project里执行如下命令
$ docker build -t webdemo:latest .

(5)查看本地镜像仓库是否构建成功

1
$ docker images
1
2
3
REPOSITORY                     TAG                 IMAGE ID            CREATED                  SIZE
docker.io/tomcat latest aeea3708743f Less than a second ago 529 MB
webdemo latest 10f75818641a 46 seconds ago 310 MB

(6)通过构建的镜像实例化一个容器并运行

1
$ docker run -d -p 8080:8080 webdemo:latest

(7)访问测试

访问index.jsp:http://192.168.222.131:8080/webdemo/index.jsp

image-20200215111413522

方式2:通过idea插件连接vps构建

(1)配置docker允许外网访问

在vps中配置docker允许外网访问

1
$ vim /usr/lib/systemd/system/docker.service

ExecStart属性原来值的最后追加

1
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Service]
....
....
ExecStart=/usr/bin/dockerd-current \
--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 \
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
....
....

(2)重新加载配置并重启Docker

1
2
$ systemctl daemon-reload
$ systemctl restart docker

(3)开放防火墙2375端口

开放了防火墙2375端口用于远程连接

1
2
3
$ firewall-cmd --permanent --add-port=2375/tcp
$ firewall-cmd --reload
$ firewall-cmd --list-all
  • 不需要另外开放容器映射到宿主机的端口。
  • 经操作发现,如果使用vmware的linux作为vps,不能直接关闭防火墙,开放相应的端口即可。

(4)创建一个springboot项目

image-20200216133115274

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--将其他模块的依赖一起打包生成可执行jar-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

DemoApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author qcmoke
*/
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

@RequestMapping("/hello")
public Object hello() {
return "hello docker!";
}
}

application.yml

1
2
server:
port: 8080

Dockerfile

1
2
3
4
5
6
7
8
9
FROM openjdk:8u212-jre
#存放持久化数据的目录
VOLUME /tmp
#要复制到容器中的问件
ADD target/demo-boot-0.0.1-SNAPSHOT.jar /demo-boot.jar
#docker容器启动时执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo-boot.jar"]
#启动端口号(容器中的)
EXPOSE 8080

(5)编译项目生成jar包

image-20200216134810561

(6)配置远程docker插件连接

默认新版的idea自带有这个插件,如果没有直接到插件中心安装即可。

image-20200216133850397

(7)然后配置DockerFile

image-20200216132351344

image-20200216134320278

(8)运行docker插件

运行插件部署镜像到vps,并通过镜像创建一个实例容器

image-20200216140432811

(9)访问测试

最后访问: http://192.168.222.132:8080/hello

image-20200216141102237

九、问题排错

(1)Error response from daemon: oci runtime error: container_linux.go:247: start....,原因是系统和docker版本不兼容。解决:执行yum update

(2)rying to pull repository docker.io/library/mysql ... Get https://registry-1.。解决:执行以下命令:

1
2
3
4
$ yum install bind-utils     #安装dig工具
$ dig @114.114.114.114 registry-1.docker.io
$ vi /etc/hosts
52.54.155.177 registry-1.docker.io

(3)[root@izuf6dskn3b7v2sly08bqtz ~]# docker pull mysql Using default tag: latest Trying to pull repository docker.io/library/mysql ... Get https://registry-1.docker.io/v2/: x509: certificate is valid for *.theranest.com, theranest.com, not registry-1.docker.io

解决:镜像加速解决



----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%