docker入门级使用-看完速会(附官网详细地址)

一、docker容器是什么及应用场景

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。

——就是一个软件的打包技术

Docker容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会退出,隔离的环境有自己的系统文件、IP地址、主机名等。

Docker主要应用场景:

1、程序打包和发布

2、持续集成

3、部署微服务

4、快速搭建测试环境

5、……

二、容器和虚拟化区别


总结:

容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行Linux系统。

虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

三、docker的安装

Docker在Ubuntu上支持最好,其他安装方法参考文档;

目前ubuntu有企业版和社区版,企业版收钱,社区版开源。

Ubuntu:(社区版)https://docs.docker.com/install/linux/docker-ce/ubuntu/

注:操作系统必须64位

我自己安装的过程命令(我是用root用户执行的,非root用户命令前加sudo):

#查看系统版本

uname -a

#清除已有的docker

apt-get remove docker

docker-engine docker.io containerd runc

#安装依赖包

apt-get install -y

apt-transport-https ca-certificates curl gnupg-agent software-properties-common

#添加官方秘钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

#添加版本库

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#更新缓存

apt-get update

#安装docker

apt-get install docker-ce

docker-ce-cli containerd.io

#检查安装版本

docker version

docker version查看:

可以看出,docker是c/s架构,go语音开发,源代码托管在Git仓库。


四、docker的主要组成部分

一个完整的docker有以下几个部分组成:

1.Docker Client客户端

2.Docker Daemon守护进程(服务端)

3.Docker Image镜像(容器的源代码,存放在docker仓库中)

4.Docker Container容器(通过镜像启动)

5.Docker Registry仓库(储存镜像,分为公有和私有)

五、docker的镜像管理

官方文档:https://docs.docker.com/engine/reference/commandline/image/


1、搜索镜像:docker search

选镜像尽量选官方或是星星高的


2、命令详解


常用的:

(1)将镜像打包:docker [image] save -o xx.tar 镜像名:版本号

(2)导入镜像包:docker [image]  load --input **.tar

(3)指定镜像打tag:docker [image]source_image target_image

(4)推送镜像至仓库:docker [image] push imageName:版本

(5)从仓库拉去镜像:docker [image] pull imageName:版本

(6)删除镜像:docker image rm 镜像ID  或 docker rmi 镜像ID

六、docker的容器管理

1、docker容器的网络端口映射

docker容器的网络模式介绍:https://www.cnblogs.com/yy-cxd/p/6553624.html

默认网络模式下:docker:172.17.0.1  后面启动的容器IP范围:172.17.0.2/24

指定映射端口:docker run -p hostPort:containerPort    例如:要将容器里8080端口,映射到宿主机的8083端口,则-p 8083:8080

随机映射端口: -P(大写)  或  -p :containerPort

指定多个端口:-p hostPort:containerPort -p hostPort:containerPort

指定IP地址映射端口:ip:hostPort:containerPort

2、docker容器的数据持久化

常用的2种类型:

通过参数:-v  或—mount

1)将宿主机的目录作为数据持久化目录

-vhostDir:containerDir  或者—mount type=bind,source= hostDir,target= containerDir

如:docker run -d -it -v /home/docker/mysql/datadir: /var/lib/mysql -p 3306:3306 mysql:5.7

或者

docker run -d -it --mount type=bind,source=/home/docker/mysql/datadir,target=/var/lib/mysql -p 3306:3306 mysql:5.7

:-v时,文件对文件hostFile:containerFile,目录对目录hostDir:containerDir。

此方式宿主机的内容会覆盖容器的内容。

2) 数据卷的形式:

a、创建一个卷docker volume create卷名

在/var/lib/docker/volumes下会多出一个目录

b、  不创建直接run,会生成一个卷,但是没有名字,难以管理

-v 卷名: containerDir  或者--mount type=volume,source 卷名,target= containerDir

如:docker run -d -it-v  mysql_db: /var/lib/mysql -p 3306:3306mysql:5.7

或者

docker run -d -it --mount type=volume,source=卷名,target=/var/lib/mysql -p 3306:3306 mysql:5.7

3、docker容器常用命令

官方文档:https://docs.docker.com/engine/reference/commandline/docker/

注意:(docker  image  | docker container后跟命令 ) 都可在docker [options]中有对应的命令,通常习惯使用后者。

1、  启动容器docker run  :运行一个mysql5.7容器:docker run  == docker create && dockerstart

https://docs.docker.com/engine/reference/commandline/run/

#添加加速器

vim /etc/docker/daemon.json

{

 "registry-mirrors": ["https://registry.docker-cn.com"]

}

#重载器配置

systemctl daemon-reload

#重启docker

systemctl restart docker

#使docker开机自启动

systemctl enable docker

#运行一个mysql服务:

docker run --restart=always --name

mysql5.7 -p 3306:3306 -v /home/docker/mysql/datadir:/var/lib/mysql -v

/home/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=test -d

mysql:5.7

-d 后台运行

-it 分配交互式的终端

--name 指定容器名字

--restart=always 容器自动容器

-e 环境变量

-p 映射端口

-v 磁盘挂载(文件对文件,目录对目录)

……

注:启动容器时,要有一个可以夯得住的启动命令才能把容器夯住。

2、进入容器:docker exec -it mysql5.7 bash  (有自己的终端)   docker attach mysql5.7(公用终端,能看到对方在干啥,退出对方也被退出),验证mysql是否可用。


3、 停止|启动|重启容器:docker stop 容器ID或容器名 && docker start容器ID或容器名 && docker restart容器ID或容器名

4、 删除容器(只能删除停止的容器):docker rm 容器ID或容器名

七、手动将容器保存镜像(制作一个有jdk的基础镜像)

很多时候我们需要定制化自己的镜像,且现在项目应用的基础环境基本是能确定的,比如很多官方镜像没有基础命令如ifconfig\ping\tail\less等,还有缺失运行环境,如java环境,maven环境等等,通过一次制作,之后到处使用。

下面我们就一步一步制作一个基于centos的jdk8的基础镜像。

步骤:

docker search centos

#先下载一个有jdk的基础镜像

docker pull centos

#启动镜像

docker run -d --name base centos

tail -f

#下载jdk8(64位Linux版的)

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

#将JDK8 cp到容器里

docker cp

jdk-8u231-linux-x64.tar.gz base:/opt

#进入容器

docker exec -it base bash

#解压jdk tar 设置环境变量

tar -zxvf  jdk-8u231-linux-x64.tar.gz

vi ~/.bashrc

添加:

export JAVA_HOME=/opt/jdk1.8.0_231

export JRE_HOME=${JAVA_HOME}/jre

export

CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH

export

JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin

export PATH=$PATH:${JAVA_PATH}

#退出,使文件生效

source  ~/.bashrc

#成功

java -version

#关键步骤来了,开始将我们的容器提交成镜像

docker commit base  centos-jdk8:v1

#检查镜像,多了一个名为centos-jdk8版本为v1的镜像

docker images

#验证镜像,启动成功后进入容器,输入java -version,可以看到jdk版本

docker run -itd  centos-jdk8:v1 tail -f

八、dockerfile自动构建容器(制作一个有jdk的基础镜像)

手动创建步骤繁杂,且步骤不可复用,使用dockerfile,调通一次之后,可以到处共享此dockerfile。

官方:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

步骤:

#创建一个文件夹,将jdk8的tar文件放到此目录下

mkdir jdk8

#载文件夹下创建一个dockerfile文件

vi dockerfile

#引入基础镜像

FROM centos

#注ADD命令会将压缩包解压

ADD jdk-8u231-linux-x64.tar.gz /opt

ENV JAVA_HOME=/opt/jdk1.8.0_231

ENV JRE_HOME=${JAVA_HOME}/jre

ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH

ENV JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin

ENV PATH=$PATH:${JAVA_PATH}

#build dockerfile,(后面有个.)

docker build -t centos-jdk8:v2 .

#也可以直接通过RUN 在线安装,但是通过RUN跟着的命令必需是连续的,不需人为干预##的,例如 apt-get install net-tools就不行,必须apt-get install net-tools  -y,而且每次使用#RUN相当于是重新起了个容器,所以有关联性的命令需要在一个RUN后面执行完

#验证

docker run -itd  centos-jdk8:v2 tail -f

小试牛刀:在基础镜像中把maven、jenkins、Tomcat等任选打包进去,生成另一个基础镜像。

Maven地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/

Jenkins:https://jenkins.io/zh/download/

Tomcat:https://tomcat.apache.org/download-80.cgi

提示:需要镜像启动时执行命令,且是不能被替换的可用参数:ENTRYPOINT

如:ENTRYPOINT java ${JVM_OPTIONS} -jar application.jar

九、docker网络介绍

官网:

https://docs.docker.com/network/

1、自带网络类型

Docker run -d –network [网络类型]

1)bridge

此类型为默认类型

2)None

此类型不配置任何网络功能

3)Host

与宿主机共享网络,性能最优。

4)container

共享容器的网络

--network container:containerId

2、自定义网络-了解不太清晰

1) Macvlan

https://docs.docker.com/network/macvlan/

跨主机容器之间通信,可指定mac地址。但启动时需要制定IP。

a、宿主机1和宿主机2分别创建名为macvlan_t

 dockernetwork create --driver macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1-o parent=eth0 macvlan_t

b、宿主机1和宿主机2分别使用macvlan_t网络启动容器

宿主1:docker run -d --name nginx2 --network macvlan_t --ip 192.168.0.100  nginx:t1

宿主2:docker run -d --name nginx2 --network macvlan_t --ip 192.168.0.101  nginx:t1

c、直接可以使用ssh连接到192.168.0.100和192.168.0.101访问此容器(前提是有ssh服务)

由于机器限制,无法进行验证,感兴趣可以自行演示

十、docker-compose(单机版的容器编排工具)

官方命令文档:https://docs.docker.com/compose/reference/

当部署的服务很多时,一个一个run容器效率很低,管理很麻烦,而使用docker-compose编排工具,可解决该痛点。

1、安装:

https://docs.docker.com/compose/install/

#安装

curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o/usr/local/bin/docker-compose

#授权

chmod +x /usr/local/bin/docker-compose

#将可执行命令软连接到系统文件

ln -s /usr/local/bin/docker-compose/usr/bin/docker-compose

#查看版本

docker-compose -version

2、常用命令

官方文档:https://docs.docker.com/compose/reference/

-d后台执行

创建并启动所有容器:docker-compose up -d ==docker-compose create && docker-composestart

创建并启动指定容器:docker-compose up -d serviceName

停止并删除所以容器:docker-compose down

重启指定容器:docker-compose restart -d serviceName

创建并启动指定数量的容器:docker-compose scale serviceName=3

3、docker-compose.yml文件

官方文档:https://docs.docker.com/compose/compose-file/

#mysql的docker-compose.yml

version: '3'

services:

 mysql:

   image: mysql:5.7

   environment:

      MYSQL_ROOT_PASSWORD: "test"

   restart: always

   volumes:

      -"/home/docker-compose/mysql/conf.d:/etc/mysql/conf.d"

      -"/home/docker-compose/mysql/datadir:/var/lib/mysql"

   ports:

      - "3307:3306"

#保存后在compose文件又在目录下执行命令启动      如果要指定compose文件使用 docker-compose  -f 指定compose.yml文件路径 up -d 

docker-compose up -d mysql

十一、搭建docker registry

https://docs.docker.com/registry/deploying/

一般企业都会有自己的私有仓库,在局域网内管理自己的docker仓库,存放自己的镜像。我看大部分用的是harbor

#不带域名解析的简单搭建

docker run -itd -v /home/test/docker-compose/registry/data:/var/lib/registry -p 5000:5000 --name=registry registry:2

#验证

root@i-x5iqfwdu:~# curl http://localhost:5000/v2/_catalog

#显示如下,表明仓库已启动

{"repositories":[]}

#直接push报了个错,找不到,得先打tag,然后就能push了

root@i-x5iqfwdu:~# docker push localhost:5000/centos-jdk8:v2

The push refers to repository [localhost:5000/centos-jdk8]

An image does not exist locally with the tag:localhost:5000/centos-jdk8

root@i-x5iqfwdu:~# docker tag centos-jdk8:v2

localhost:5000/centos-jdk8:v2

root@i-x5iqfwdu:~# docker push localhost:5000/centos-jdk8:v2

The push refers to repository

[localhost:5000/centos-jdk8]

17741937a3e1: Pushed

9e607bb861a7: Pushed

v2: digest: sha256:e77313993d82fe1668034efd53b93411ea949b9714dc41d7347914db309463ba

size: 742

root@i-x5iqfwdu:~# curl http://localhost:5000/v2/_catalog

{"repositories":["centos-jdk8"]}

十一、总结(图)



十二、docker监控

监控CPU、内存、磁盘I/O、网络I/O使用情况。

1、  后台命令监控:

docker stats [容器]

2、其他方法

CADvsior监控+influxdb+grafana

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342