文章目录
Docker容器技术
容器(Container) 是一种轻量级的操作系统虚拟化技术,它允许将应用程序及其所有依赖(代码、运行时、系统工具、库等)打包成一个独立的、可移植的运行环境。
可以把容器想象成一个 "标准化货物集装箱":无论里面装的是什么软件,它都能在任意一台支持容器技术的服务器上快速、一致地运行,而不用担心环境差异导致的问题。
容器与虚拟机不同,它不包含完整的操作系统内核 ,而是与宿主机共享内核,通过命名空间(Namespace) 实现资源隔离,通过 控制组(Cgroups) 实现资源限制。
docker部署
添加软件源信息
bash
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@server1 yum.repos.d]# ls
CentOS-Base.repo docker-ce.repo
安装docker并设置开机自启
bash
[root@server1 yum.repos.d]# yum install -y docker-ce
[root@server1 yum.repos.d]# systemctl enable --now docker
校验
bash
[root@server1 yum.repos.d]# docker info
如果出现如下警告,解决办法如下

激活内核选项(可选)
bash
[root@server1 yum.repos.d]# echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/docker.conf
[root@server1 yum.repos.d]# echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/docker.conf
[root@server1 yum.repos.d]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/docker.conf
下载bridge-utils,并查看我们写入的参数
bash
[root@server1 yum.repos.d]# yum install -y bridge-utils
[root@server1 yum.repos.d]# sysctl --system

重启docker服务再次查看
bash
[root@server1 yum.repos.d]# systemctl restart docker
[root@server1 yum.repos.d]# docker info
警告消失,启动成功

配置镜像加速器
参考:https://www.mliev.com/docs/1ms.run/config-mirror/linux
bash
[root@server1 ~]# echo '{"registry-mirrors":["https://docker.1ms.run"],"dns": ["8.8.8.8", "114.114.114.114"]}' > /etc/docker/daemon.json
[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl restart docker
docker操作命令
通过代理查看镜像
bash
[root@server1 yum.repos.d]# docker search docker.1ms.run/yakexi007
[root@server1 docker]# docker search docker.1ms.run/nginx
[root@server1 docker]# docker search docker.1ms.run/busybox

通过代理拉取镜像
bash
[root@server1 yum.repos.d]# docker pull docker.1ms.run/yakexi007/game2048
[root@server1 docker]# docker pull docker.1ms.run/nginx
[root@server1 docker]# docker pull docker.1ms.run/busybox

查看拉取来的镜像
bash
[root@server1 docker]# docker images

给本地镜像添加一个新的标签
bash
[root@server1 docker]# docker tag docker.1ms.run/yakexi007/game2048 game2048

删除镜像
bash
[root@server1 docker]# docker rmi docker.1ms.run/yakexi007/game2048

查看docker镜像端口
bash
[root@server1 docker]# docker history game2048

后台启动docker镜像
bash
[root@server1 docker]# docker run -d --name demo -p 80:80 game2048
67decd2e515684407edb2abb1452e203f2af554da85d23b341c4b64460af7df6
#如果用ps查看不到容器,可以使用logs来拉取错误日志
[root@server1 ~]# docker logs game2048
#如果容器启动了但无法使用,需要远程开shell解决,进去后是超户权限
[root@server1 ~]# docker exec -it game2048 bash
查看镜像
bash
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67decd2e5156 game2048 "/bin/sh -c 'sed -i ..." About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp demo

交互式启动容器(此时的操作在容器内部的容器层,生命周期随容器一起)
bash
[root@server1 ~]# docker run -d --name demo -p 80:80 game2048
81e483ab174b1d76514b1cbe0de060ceb8dfb4b8455659cbb18f689432c4c327
[root@server1 ~]# docker run -it busybox
/ # ls
bin etc lib proc sys usr
dev home lib64 root tmp var
/ # touch file1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ #
#进程随着退出停止,且未命名时会自动命名
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81e483ab174b game2048 "/bin/sh -c 'sed -i ..." 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp demo
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3992867ab575 busybox "sh" 3 minutes ago Exited (130) 8 seconds ago romantic_bartik
81e483ab174b game2048 "/bin/sh -c 'sed -i ..." 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp demo
删除容器
bash
#删除停止的容器
[root@server1 ~]# docker rm romantic_bartik
romantic_bartik
#删除正在运行的容器
[root@server1 ~]# docker rm -f demo
demo
容器状态
bash
#给运行的容器命名
[root@server1 ~]# docker run -it --name test busybox
/ # ls
bin etc lib proc sys usr
dev home lib64 root tmp var
/ # touch file1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ #
#Ctrl+D或者exit退出,容器也会停止
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
777b4cb5fd91 busybox "sh" 40 seconds ago Exited (0) 6 seconds ago test
#可以用start恢复
[root@server1 ~]# docker start test
test
#attach重新连入
[root@server1 ~]# docker attach test
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # read escape sequence
#Ctrl+q+p可以退出容器交互界面但不停止容器
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
777b4cb5fd91 busybox "sh" 2 minutes ago Up About a minute test
[root@server1 ~]# docker attach test
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ #
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
777b4cb5fd91 busybox "sh" 2 minutes ago Exited (0) 7 seconds ago test
[root@server1 ~]# docker rm test
test
分享镜像
bash
#可以将多个镜像放入tar包里,便于分享给他人
[root@server1 ~]# docker save -o nginx.tar nginx
[root@server1 ~]# ll nginx.tar
-rw------- 1 root root 165484032 Aug 29 15:55 nginx.tar
#删除本机镜像
[root@server1 ~]# docker rmi nginx:latest
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest c6348fa86ba0 3 months ago 4.45MB
game2048 latest 19299002fdbe 9 years ago 55.5MB
#通过tar包离线下载镜像
[root@server1 ~]# docker load -i nginx.tar
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 38becec41bfa 4 days ago 162MB
busybox latest c6348fa86ba0 3 months ago 4.45MB
game2048 latest 19299002fdbe 9 years ago 55.5MB
部署应用堆栈
直接从官网下载
bash
[root@server1 ~]# docker search docker.1ms.run/yakexi007
[root@server1 ~]# docker pull docker.1ms.run/yakexi007/httpd:webapp
[root@server1 ~]# docker pull docker.1ms.run/yakexi007/mysql:latest
或导入本地镜像
bash
[root@server1 ~]# docker load -i mysql.tar
[root@server1 ~]# docker load -i httpd.tar
显示镜像列表
bash
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 38becec41bfa 4 days ago 162MB
busybox latest c6348fa86ba0 3 months ago 4.45MB
httpd webapp 8510534955fc 7 years ago 452MB
game2048 latest 19299002fdbe 9 years ago 55.5MB
mysql latest 1195b21c3a45 10 years ago 380MB
修改镜像名称(从官网下载才需要)
bash
[root@server1 ~]# docker tag yakexi007/httpd:webapp httpd:webapp
[root@server1 ~]# docker tag yakexi007/mysql:latest mysql:latest
创建数据库容器
bash
[root@server1 ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=redhat --name dbserver mysql
安装mysql客户端
bash
[root@server1 ~]# yum install -y mariadb
导入数据并查看
bash
[root@server1 ~]# ls
anaconda-ks.cfg httpd.tar mysql.tar nginx.tar os.sql
[root@server1 ~]# mysql -h 127.0.0.1 -u root -predhat < os.sql
[root@server1 ~]# mysql -h 127.0.0.1 -predhat
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cinder |
| glance |
| heat |
| keystone |
| mysql |
| performance_schema |
| sys |
+--------------------+
8 rows in set (0.00 sec)
创建web容器
bash
[root@server1 ~]# docker run -d -p 80:80 --link dbserver:db --name webserver httpd:webapp
7ceaa9ef31e582aa71fb397c3c0533955ffe93242f2cf4adb3eca7e898bd3527
访问测试(替换为自己主机IP)

192.168.117.130/cgi-bin/action
清除所有容器
bash
[root@server1 ~]# docker rm -f $(docker ps -aq)
7ceaa9ef31e5
1e0c81eff42c
docker核心概念
镜像(Image)
Docker 镜像(Image)就是一个只读的模板、一个标准化包。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。镜像内包含操作系统,提供容器运行时所需的所有文件、二进制文件、库和配置等文件外,还包含了一些为运行时准备的一些配置参数(如环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
镜像有两个重要原则:
-
镜像是不可变的。镜像一旦创建,就无法修改。您只能创建新镜像或在其上添加更改。
-
容器镜像由层组成。每层代表一组添加、删除或修改文件的文件系统更改。
容器(Container通过镜像创建)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的空间,因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(存放镜像的地方)
仓库类似于应用商店,存放的是docker镜像,分为公开仓库跟私有仓库。通常,仓库可以包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<镜像名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest作为默认标签。
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
