草庐IT

docker安装及基本命令

wangranran 2023-03-28 原文

Docker官网:https://docs.docker.com/
Docker的github地址:https://github.com/moby/moby

Dockerhub官网
https://registry.hub.docker.com

如果docker官方registry拉取镜像速度很慢,可以尝试daocloud提供的加速器服务
https://dashboard.daocloud.io/mirror

1、docker是什么?

  Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在GitHub 上进行维护。

  Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何支持docker的机器上运行。容器是完全使用沙箱机制,相互之间不会有任何接口调用。

Docker logo:

  Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被装在集装箱里,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送蔬菜的船和专门运送货物的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
docker就是类似的理念。云计算就好比大货轮。docker就是集装箱。

2、docker的优点

1)快
   运行时的性能快,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。
2)敏捷
   像虚拟机一样敏捷,而且会更便宜,在bare metal(裸机)上布署像点个按钮一样简单。
3)灵活
   将应用和系统“容器化”,不添加额外的操作系统
4)轻量
   在一台服务器上可以布署100~1000个Containers容器。
5)便宜
   开源的,免费的,低成本的。

docker-ce: 社区版
docker-ee: 商业版

3、docker缺点

所有容器共用linux kernel资源,资源能否实现最大限度利用,所以在安全上也会存在漏洞。

4、安装Docker

主机ip:192.168.40.180
Centos7.6-centos7.9
4Gib/4vCPU

配置主机名:
[root@k8smaster1 ~]# hostnamectl set-hostname k8smaster1 && bash

关闭防火墙
[root@k8smaster1 ~]# systemctl stop firewalld && systemctl disable firewalld

关闭iptables防火墙
[root@k8smaster1 ~]# yum install iptables-services -y #安装iptables
禁用iptables
[root@k8smaster1 ~]# service iptables stop && systemctl disable iptables
清空防火墙规则
[root@k8smaster1~]# iptables -F

关闭selinux
[root@k8smaster1 ~]# setenforce 0
[root@k8smaster1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
注意:修改selinux配置文件之后,重启机器,selinux才能永久生效

[root@k8smaster1 ~]# getenforce
显示Disabled表示selinux关闭成功

配置时间同步
[root@k8smaster1 ~]# yum install -y ntp ntpdate
[root@k8smaster1 ~]# ntpdate cn.pool.ntp.org
编写计划任务
[root@k8smaster1 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
重启crond服务使配置生效:
[root@k8smaster1 ~]# systemctl restart crond

安装基础软件包
[root@k8smaster1 ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack

安装docker-ce
配置docker-ce国内yum源(阿里云)
[root@k8smaster1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker依赖包
[root@k8smaster1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce
[root@k8smaster1 ~]# yum install docker-ce -y

启动docker服务

[root@k8smaster1 ~]# systemctl start docker && systemctl enable docker
[root@k8smaster1 ~]# systemctl status docker
- docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-07-01 21:29:18 CST; 30s ago
     Docs: https://docs.docker.com

看到running,表示docker正常运行

查看Docker 版本信息
[root@k8smaster1 ~]# docker version

5、开启包转发功能和修改内核参数

内核参数修改:br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。

[root@k8smaster1 ~]# modprobe br_netfilter
[root@k8smaster1 ~]# cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

#使参数生效
[root@k8smaster1 ~]# sysctl -p /etc/sysctl.d/docker.conf

重启后模块失效,下面是开机自动加载模块的脚本

在/etc/新建rc.sysinit 文件
cat /etc/rc.sysinit

#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done

在/etc/sysconfig/modules/目录下新建文件如下

cat /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter

增加权限
[root@k8smaster1 ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

重启机器模块也会自动加载

[root@localhost ~]# lsmod |grep br_netfilter
br_netfilter 22209 0
bridge 136173 1 br_netfilter
  • 注:
    Docker 安装后出现:WARNING: bridge-nf-call-iptables is disabled 的解决办法:
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1
  将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。当linux主机有多个网卡时一个网卡收到的信息是否能够传递给其他的网卡 ,如果设置成1 的话 可以进行数据包转发,可以实现VxLAN 等功能。不开启会导致docker部署应用无法访问。

重启docker
[root@k8smaster1 ~]# systemctl restart docker

6、配置docker镜像加速器

登陆阿里云镜像仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
如果没有开通,可开通阿里云的镜像服务

找到镜像加速器,然后按照箭头方向操作
修改/etc/docker/daemon.json,变成如下

{
 "registry-mirrors":["https://y8y6vosv.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}

让配置文件生效

sudo systemctl daemon-reload
sudo systemctl restart docker

7、docker的基本用法

7.1 镜像相关操作

从dockerhub查找镜像
[root@k8smaster1 ~]# docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                            The official build of CentOS.                   6639      [OK]       
ansible/centos7-ansible           Ansible on Centos7                              134                  [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   129                  [OK]
jdeathe/centos-ssh                OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   118                  [OK]

解释说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。

#下载镜像
[root@k8smaster1 ~]# docker pull centos

#查看本地镜像
[root@k8smaster1 ~]# docker images


#把镜像做成离线压缩包
[root@k8smaster1 ~]# docker save -o centos.tar.gz centos

#解压离线镜像包
[root@k8smaster1 ~]# docker load -i centos.tar.gz 

#删除镜像
[root@k8smaster1 ~]# docker rmi -f centos:latest

7.2 容器相关操作

以交互式方式启动并进入容器

[root@k8smaster1 ~]# docker run --name=hello -it centos /bin/bash
[root@09c4933b5cd7 /]#

输入exit,退出容器,退出之后容器也会停止,不会再前台运行

#docker run运行并创建容器
--name 容器的名字
-i 交互式
-t 分配伪终端
centos: 启动docker需要的镜像
/bin/bash说明你的BASH类型为bash,bash BASH是最常用的一种BASH, 是大多数Linux发行版默认的BASH。 此外还有C BASH等其它BASH。

以守护进程方式启动容器

[root@k8smaster1 ~]# docker run --name=hello1 -td centos 
[root@k8smaster1 ~]# docker ps |grep hello1
1a2b73ba0ac2   centos            "/bin/bash"             hello1

-d 在后台运行docker
[root@k8smaster1 ~]# docker exec -it hello1 /bin/bash

查看正在运行的容器

docker ps

[root@k8smaster1 ~]# docker ps -a  #查看所有容器,包括运行和退出的容器

停止容器

docker stop hello1

启动已经停止的容器

docker start hello1

进入容器

docker exec -it hello1 /bin/bash
[root@k8smaster1 ~]# docker rm -f hello1 #删除容器

[root@k8smaster1 ~]# docker --help
#查看docker帮助命令

8、通过docker部署nginx服务

[root@k8smaster1 ~]# docker run --name nginx -p  80 -itd centos 

# -p把容器端口随机在物理机随机映射一个端口

[root@k8smaster1 ~]# docker ps | grep nginx
ecfa046e9681   centos                                              "/bin/bash"              5 seconds ago   Up 4 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx

# 在docker里安装nginx
docker exec -it nginx /bin/bash 
[root@ecfa046e9681]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# 通过上面可以看到容器的ip是172.17.0.3


# yum安装nginx
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum install wget -y
yum install nginx -y 

# 安装文本编辑器vim
yum install vim-enhanced -y

# 创建静态页面
mkdir /var/www/html -p
cd /var/www/html/
cat index.html
<html>
        <head>
                 <title>nginx in docker</title>
        </head>
        <body>
                <h1>hello,My Name is xianchao</h1>
        </body>
</html>

修改nginx配置文件中的root路径,如下
vim /etc/nginx/nginx.conf
root         /var/www/html/;

启动nginx
/usr/sbin/nginx

访问docker里的nginx服务,复制一个终端窗口,执行如下命令
[root@k8smaster1 ~]# docker ps | grep nginx
ecfa046e9681   centos                                              "/bin/bash"              12 minutes ago   Up 12 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx

#能查看到nginx容器在物理机映射的端口是49153

[root@k8smaster1 ~]# curl http://192.168.40.180:49153
<html>
	<head>
		 <title>nginx in docker</title>
	</head>
	<body>
		<h1>hello,My Name is xiaobeiwo</h1>
	</body>
</html>

也可以直接访问容器的ip:port
[root@k8smaster1 ~]# curl 172.17.0.3:80
<html>
	<head>
		 <title>nginx in docker</title>
	</head>
	<body>
		<h1>hello,My Name is xiaobeiwo</h1>
	</body>
</html>

流量走向:
访问物理节点ip:port(容器在物理节点映射的端口)--容器ip:port(容器里部署的服务的端口)->就可以访问到容器里部署的应用了

有关docker安装及基本命令的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby - 完全离线安装RVM - 2

    我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

  4. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  5. ruby - 如何为 emacs 安装 ruby​​-mode - 2

    我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby​​提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs

  6. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  9. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐