【Docker】Docker容器搭建及基本使用

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

目录

  • 一、安装环境
  • 二、Docker安装
  • 三、Docker基本使用
  • 四、Docker安装CentOS
  • 五、Docker安装MySQL
  • 六、Docker安装Tomcat
  • 七、Docker GUI管理
  • 八、参考并致谢

一、安装环境

操作系统:CentOS 7(建议用7或以上,因为6版本有部分功能不兼容)

二、Docker安装

1、卸载旧版本
[root@bogon ~]# yum remove docker \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-engine
2、安装所需软件包
[root@bogon ~]# yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
3、设置仓库
[root@bogon ~]# yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
4、安装最新版本
[root@bogon ~]# yum install docker-ce docker-ce-cli containerd.io

如果不是安装最新版本可以使用以下步骤:
查看可用版本:

[root@bogon ~]# yum list docker-ce --showduplicates | sort -r

然后使用命令安装对应得版本:

[root@bogon ~]# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

-- 如:yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
5、安装完后启动
[root@bogon ~]# systemctl start docker
6、验证
[root@bogon ~]# docker run hello-world

root@0316378d2b63:/#

三、Docker基本使用

1、容器的使用

直接输入docker命令可查看到docker命令的选项

启动容器

使用以下命令启动一个容器:

[root@bogon ~]# docker run -it ubuntu /bin/bash

参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

如果需要退出则直接输入exit命令即可

如果需要后台运行可加上-d参数

[root@bogon ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash

其中,-name是指定容器的名字,名字可以自定义

查看所有容器
[root@bogon ~]# docker ps -a
启动、关闭、重启一个已存在的容器
-- 启动  
[root@bogon ~]# docker start <容器ID>  
-- 停止  
[root@bogon ~]# docker stop <容器ID>  
-- 重启 
[root@bogon ~]# docker restart <容器ID>   
进入和退出在后台运行的容器
-- 进入容器
[root@bogon ~]# docker attach <容器ID>   
-- 退出容器且不关闭
[root@bogon ~]# docker exec 
导入和导出容器
-- 导出
[root@bogon ~]# docker export <容器ID> > 导出路径 
如:docker export 1e560fca3906 > ubuntu.tar

-- 导入  
[root@bogon ~]# cat 路径 | docker import - 镜像名:标签名 
如:cat docker/ubuntu.tar | docker import - test/ubuntu:v1
删除容器
[root@bogon ~]# docker rm -f <容器ID>

清空所有处于终止状态的容器:

[root@bogon ~]# docker container prune
使用容器运行一个web应用

载入镜像和启动容器

-- 载入镜像
[root@bogon ~]# docker pull training/webapp  
-- 运行容器(其中P参数将容器内部使用的网络端口映射到我们使用的主机上)
[root@bogon ~]# docker run -d -P training/webapp python app.py

查看容器状态:

[root@bogon ~]# docker ps  


此时发现多了端口的信息,docker开放了5000端口,映射到了主机的9001端口上,此时我们可以在浏览器访问应用:

可以通过 -p 参数来配置端口

[root@bogon ~]# docker run -d -p 5000:5000 training/webapp python app.py

查看web应用程序的日志

-- 其中-f让docker logs像tail -f一样输出
[root@bogon ~]# docker logs -f <容器ID或名字>

查看web应用程序容器的进程

[root@bogon ~]# docker top <容器ID或名字>

使用docker inspect来检查docker底层信息,它会返回一个json文件记录着容器的配置和状态信息

[root@bogon ~]# docker inspect <容器ID或名字>

停止、重启、移除web应用容器

-- 停止 
[root@bogon ~]# docker stop <容器ID或名字>
-- 重启
[root@bogon ~]# docker restart <容器ID或名字>
-- 移除(移除前必须停止)
[root@bogon ~]# docker rm <容器ID或名字>
2、镜像的使用
列出所有本地主机上的镜像
[root@bogon ~]# docker images

列表各个列说明:
REPOSITORY:表示镜像的仓库源

TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

说明:同一仓库可以有多个TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

[root@bogon ~]# docker run -t -i ubuntu:15.10 /bin/bash 

如果不指定一个镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

获取新镜像
[root@bogon ~]# docker pull REPOSITORY:TAG
如:docker pull ubuntu:13.10
查找镜像

第一种方法是在docker hub网站上找:https://hub.docker.com/
第二种方法是使用docker search命令来搜索

-- 如我们需要一个httpd的镜像来作为web服务
[root@bogon ~]# docker search httpd

列表各列说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。

拖取镜像
-- 拖取httpd镜像
[root@bogon ~]# docker pull httpd

拖取下来之后就可以使用这个镜像了

[root@bogon ~]# docker run httpd
删除镜像
-- 删除httpd镜像
[root@bogon ~]# docker rmi httpd
构建镜像

构建镜像需要我们从零开始创建一个镜像,构建镜像分为手动构建和自动构建,这里我们采用Dockerfile自动构建的方式来构建镜像,因此,我们需要创建一个DockerFile文件,其中包含一组指令来告诉docker如何构建我们的镜像

-- 创建docker使用的目录来规划存放dockerfile文件的目录(此步可忽略)
[root@bogon ~]# mkdir /home/docker
[root@bogon ~]# cd /home/docker
-- 创建文件需要注意的是:D需要大写,当我们构建镜像的时候docker默认选取当前目录下的Dockerfile文件
[root@bogon ~]# vim DockerFile

然后在Dockerfile文件加入以下内容:

FROM    centos:6.7
MAINTAINER      Catke "catke@qq.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd catke
RUN     /bin/echo 'catke:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

注意:每个指令都会在镜像上创建一个新的层,每个指令前缀都是大写,其中第一条FROM指定使用哪个镜像源,RUN指令告诉docker在镜像内执行命令,如安装了什么,需要添加什么用户

Dockerfile文件参数说明:
FROM (指定基础镜像)
MAINTAINER (指定维护者信息)
RUN (在命令前面加上RUN)
ADD (COPY文件,会自动解压,无法复制tar压缩文件,从上下文目录中复制文件或者目录到容器里指定路径,同等需求下,官方推荐使用COPY来实现)
WORKDIR (设置当前工作目录,类似于cd)
VOLUME (设置卷,挂载主机目录)
EXPOSE (指定对外的端口)
CMD (指定容器启动后要干的事情)

然后我们使用Dockerfile文件,通过docker build命令来构建一个镜像

-- 说明:-t参数后面跟着的是REPOSITORY:TAG的格式,最后的“.”不要漏了,当然你可以修改构建的位置,“.”代表的是当前目录,
[root@bogon docker]# docker build -t centos:6.7 .

构建完之后结果如下:



可以使用docker images命令来查看当前的镜像

然后我们使用这个镜像来启动一个容器,并且验证我们刚刚文件里面写的创建catke用户,结果如下:

创建镜像

当docker镜像库中的镜像不能满足我们的需求时,我们可以通过两种方式对镜像进行修改:
1、从已经创建的容器中更新镜像,并提交这个镜像
2、使用dockerfile指令来创建一个新的镜像

设置镜像标签

以刚刚构建的镜像为例

-- 将IMAGE ID为0fc552672063的镜像的tag设置为test(说明,一个镜像可以对应多个tag)
[root@bogon ~]# docker tag 0fc552672063 centos:test
3、容器连接
端口映射

端口映射可以使用-p或者-P参数来实现,其中,-P是容器内部端口随机映射到主机端口,-p是容器内部端口绑定到主机端口

-- 创建一个python应用容器,并将容器内部端口随机映射到主机端口  
[root@bogon docker]# docker run -d -P training/webapp python app.py
-- 查看容器情况
[root@bogon docker]# docker ps

可以看到当前容器端口9000绑定了5000端口

-- 创建一个python应用容器,并将容器内部端口绑定映射到主机端口  
[root@bogon docker]# docker run -d -p 5000:5000 training/webapp python app.py
-- 查看容器情况
[root@bogon docker]# docker ps

同样的,可以绑定ip

-- 创建一个python应用容器,并将容器内部端口指定映射到主机端口,并绑定127.0.0.1IP  
[root@bogon docker]# docker run -d -p 127.00.1:5001:5000 training/webapp python app.py

如果要绑定udp端口,可以在端口后面加上/udp

[root@bogon docker]# docker run -d -p 127.00.1:5001:5000/udp training/webapp python app.py
docker容器互联
-- 创建新的docker网络,其中-d参数指定docker网络类型,可以是bridge、overlay
[root@bogon docker]# docker network create -d bridge test-net
-- 查看当前docker网络
[root@bogon docker]# docker network ls
-- 运行一个容器,并使这个容器连接刚刚新建的网络  
[root@bogon docker]# docker run -it --name test1 --network test-net ubuntu /bin/bash

打开一个新的客户端,再运行一个容器,同样连接这个网络

-- 再运行一个容器,并使这个容器连接刚刚新建的网络  
[root@bogon docker]# docker run -it --name test2 --network test-net ubuntu /bin/bash
-- 分别在两个容器安装ping命令
root@6fa849899adb:/# apt-get update
root@6fa849899adb:/# apt install iputils-ping
root@540213266b2a:/# apt-get update
root@540213266b2a:/# apt install iputils-ping

在test1的容器上使用ping命令ping test2的容器



在test2的容器上使用ping命令ping test1的容器


配置DNS
[root@bogon docker]# docker run -it --rm host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

注意:如果在启动容器的时候没有指定dns信息,那么容器会默认使用主机上的/etc/resolv.conf的配置来配置DNS

4、仓库管理

docker仓库存放docker镜像的仓库,目前官方有一个公共的仓库:Docker Hub,大部分需求镜像都可以从这个镜像库上下载下来,地址是:https://hub.docker.com
基本操作:

-- 登录 
docker login   
-- 退出  
docker logout  
-- 查找镜像如sshd  
docker search sshd
-- 拉取镜像到本地  
docker pull sshd  
-- 推送镜像到Docker Hub  
docker push username/respositiry:tag

四、Docker安装CentOS

1、查看可用CentOS版本

访问CentOS镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1
查看可用标签,标签右边可以直接复制命令

2、拉取指定版本
-- 拉取镜像
[root@bogon docker]# docker pull centos:centos7
-- 查看是否拉取成功
[root@bogon docker]# docker images

之后启动容器即可

五、Docker安装MySQL

1、查看可用MySQL版本

访问MySQL镜像库地址:https://hub.docker.com/_/mysql?tab=tags 查看可用标签

2、拉取指定版本
-- 拉取镜像
[root@bogon docker]# docker pull mysql:latest
-- 查看是否拉取成功
[root@bogon docker]# docker images
-- 运行容器,
[root@bogon docker]# docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

参数说明:
-p 3306:3306:映射容器服务的3306端口到主机的3306端口,外部主机可以通过主机IP:3306端口访问数据库
MYSQL_ROOT_PASSWORD=123456:设置MySQL中root用户的密码

-- 进入容器  
docker exec -it efa46d7ea95c /bin/bash

进入容器后可以mysql -uroot -p来登录MySQL

六、Docker安装Tomcat

tomcat的安装方式跟上面的方式一致
1、搜索镜像
2、拉取镜像
3、启动容器
其它的相关服务安装方式也大致相同,这里就不多做研究

七、Docker GUI管理

这里使用Portainer来作为容器的GUI管理方案。
官方地址:https://portainer.io/install.html
安装命令:

# docker volume create portainer_data
# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

另一种安装命令:

# docker search portainer  
# docker pull portainer/portainer 
# docker run -d -p 9000:9000 -v /run/docker.sock:/run/docker.sock -v portainer_data:/data portainer/portainer

使用:
访问IP:9000 即可进入容器管理页面

八、参考并致谢

https://www.runoob.com/docker/centos-docker-install.html
https://www.cnblogs.com/lylsr/p/11173012.html

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

推荐阅读更多精彩内容