docker基础用法
- docker基础用法
- 什么是docker
- OCI&OCF
- OCI
- OCF
- docker架构
- docker镜像与镜像仓库
- docker对象
- docker安装
- 配置镜像
- docker安装
- Docker加速
- 配置阿里云加速
- docker常用操作
- 访问前把防火墙关了
- ip访问
docker基础用法
什么是docker
docker中的容器:
- lxc --> libcontainer --> runC
OCI&OCF
OCI
Open Container-initiative
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- contains two specifications
- the Runtime Specification(runtime-spec)
- the Image Specification(image-spec)
OCF
- 打开容器格式
runC是一个CLI工具,用于根据OCI规范生成和运行容器
—容器作为runC的子进程启动,可以嵌入到其他各种系统中,而无需运行守护进程
- runC构建在libcontainer之上,同样的容器技术支持数以百万计的Docker Engine安装
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
docker架构
docker镜像与镜像仓库
为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
docker对象
当你使用docker时,你是在创建和使用镜像、容器、网络、卷、插件和其他对象。
镜像
镜像是一个只读模板,带有创建docker容器的说明。
通常,一个镜像是基于另一个镜像,有一些额外的定制。
您可以创建自己的镜像,也可以只使用其他人创建的并在注册表中发布的镜像。
容器
容器是镜像的可运行实例。
可以通过docker API或CLI创建、运行、停止、移动或删除容器。
您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新的镜像。
docker安装
配置镜像
阿里云镜像网站 :https://developer.aliyun.com/mirror/
//配置阿里云源
[root@localhost ~]# cd /etc/yum.repos.d/
//把国外的源删了
[root@localhost yum.repos.d]# rm -rf *
//查看当前系统
[root@localhost yum.repos.d]# cat /etc/redhat-release
CentOS Stream release 8
[root@localhost yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
//把和阿里云相关的删了
[root@localhost yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
//清除缓存
[root@localhost]# dnf clean all
//下载新repo 到/etc/yum.repos.d/
epel(RHEL 8)
1)安装 epel 配置包
[root@localhost yum.repos.d]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
2)将 repo 配置中的地址替换为阿里云镜像站地址
[root@localhost yum.repos.d]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@localhost yum.repos.d]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
//清除缓存
[root@localhost yum.repos.d]# dnf clean all
//建立缓存
[root@localhost ~]# dnf makecache
docker安装
//AppStream 源和epel源没有docker源
[root@localhost ~]# dnf list all|grep docker
//下载wget和vim
[root@localhost ~]# dnf -y install wget vim
//下载docker源
[root@localhost yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//建立缓存
[root@localhost ~]# dnf makecache
[root@localhost ~]# dnf list all|grep docker
docker-ce.x86_64 3:20.10.14-3.el8
省略.......
//安装docker
[root@localhost ~]# dnf -y install docker-ce
//设置开机自启,并立马启动
[root@localhost ~]# systemctl enable --now docker
//查看状态
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled;>
Active: active (running) since Sun 2022-04-24 19:28:53 CST; 27s >
Docs: https://docs.docker.com
Docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
配置阿里云加速
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
//往里面写入这一行
[root@localhost ~]# vi /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://1izcbhll.mirror.aliyuncs.com"]
}
//加载
[root@localhost docker]# systemctl daemon-reload
//重启
[root@localhost docker]# systemctl restart docker
//列出docker信息
[root@localhost ~]# docker info
//查看docker版本号
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:47:44 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.14
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 87a90dc
Built: Thu Mar 24 01:46:10 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.5.11
GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc:
Version: 1.0.3
GitCommit: v1.0.3-0-gf46b6ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker常用操作
//查找
[root@localhost ~]# docker search seancheng1002/http
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
seancheng1002/httpd
//查找所有带有http的关键字的
[root@localhost ~]# docker search httpd
//列出镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
//默认没有跟版本号拉最新版的httpd
[root@localhost ~]# docker pull httpd
Using default tag: latest
......省略
//列出镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 4 months ago 144MB
//拉httpd2.4.53版本的(指定版本号)
[root@localhost ~]# docker pull httpd:2.4.53
//查看帮助手册
[root@localhost ~]# docker create --help
//创建一个容器叫web
[root@localhost ~]# docker create --name web -p 80:80 httpd
bbfa14882be4b84c64254e1363e27e0490e2905393b07dd95e722cdd61893c0a
//列出容器(ps 列出正在运行的容器)
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbfa14882be4 httpd "httpd-foreground" About a minute ago Created web
//启动容器
[root@localhost ~]# docker start web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbfa14882be4 httpd "httpd-foreground" 2 minutes ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
//停止容器web
[root@localhost ~]# docker stop web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//重启容器(防火墙打开才能启动容器)
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# docker restart web
web
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbfa14882be4 httpd "httpd-foreground" 16 minutes ago Up 8 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
//设置防火墙默认放行端口号(设置放行端口号)
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=0.0.0.0/0 service name=http accept' --permanent
success
//重新加载
[root@localhost ~]# firewall-cmd --reload
success
//查看
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="0.0.0.0/0" service name="http" accept
//防火墙不放行规则是访问不了的
//查看日志
[root@localhost ~]# docker logs web
192.168.229.1 - - [24/Apr/2022:12:44:21 +0000] "GET / HTTP/1.1" 304 -
192.168.229.1 - - [24/Apr/2022:12:44:22 +0000] "GET / HTTP/1.1" 304 -
192.168.229.1 - - [24/Apr/2022:12:45:12 +0000] "-" 408 -
//杀死一个或多个运行中的容器
[root@localhost ~]# docker kill web
web
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbfa14882be4 httpd "httpd-foreground" 31 minutes ago Exited (137) 3 seconds ago web
//在运行中的容器是不能删的,可以先停掉再删(如果真要在运行中删加上-f)
[root@localhost ~]# docker rm -f web
web
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//在新容器中运行命令 (-it是交互模式)
[root@localhost ~]# docker run -it --name test busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
//连接到运行的容器
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker attach test //这种方式进来退出就停掉容器
/ # exit
//在运行的容器中运行命令(就算退出也在运行)
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker exec -it test /bin/sh
/ # exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6aa2c2b87349 busybox "/bin/sh" 10 minutes ago Up 34 seconds test
访问前把防火墙关了
//关闭防火墙,并开机不自启
[root@localhost ~]# systemctl disable --now firewalld
[root@localhost ~]# vi /etc/selinux/config
SELINUX=disabled //把这个改为disabled
[root@localhost ~]# setenforce 0
ip访问