Docker 容器技术入门:部署、核心概念与基础命令

文章目录

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

访问:192.168.117.130

交互式启动容器(此时的操作在容器内部的容器层,生命周期随容器一起)

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

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可以运行在同一台集群,也可以通过跨主机实现远程通信。

相关推荐
2601_9620723327 分钟前
docker自建rustdesk-server远程桌面
运维·docker·容器
Blockchina1 小时前
Codex 实战:从一句需求到可验收的 Linux 主机巡检脚本
运维·服务器·网络
2601_962218471 小时前
万象生鲜系统冷链物联网接入技术实现生鲜企业温控管理数字化
大数据·运维·微服务·云原生·架构
Best-Wishes1 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
pnoker1 小时前
从零部署 IoT DC3:四步快速启动实录
物联网·docker·部署
志栋智能1 小时前
从关联到因果:智能超自动化如何实现真正的根因分析定界
运维·自动化
虎王物联1 小时前
RK3568嵌入式Linux跑Docker:内核配置排查到AIoT容器化的完整路径
linux·运维·docker·rk3568·aiot·嵌入式linux
报错小能手2 小时前
Kubernetes入门实战课 1
云原生·容器·kubernetes
从入门到退休3 小时前
企业远程控制选型:向日葵SDK vs RustDesk自建,谁是更务实的选择?
运维·服务器·网络·远程工作·远程控制