文章目录
1. Docker概述
Docker是一个用于开发、发布和运行应用程序的开放平台。
Docker能够将应用程序与基础设施分离隔开,从而可以快速交付软件。使用Docker,可以像管理应用程序一样管理基础结构。通过利用Docker快速发布、测试和部署代码,可以显著减少编写代码和在生产中运行代码之间的延迟。
容器是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的系统文件,有独立ip地址,主机名等
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行 部署服务,环境问题
一次构建,处处运行
2. 容器和虚拟化的区别
Linux容器技术,容器虚拟化和kvm虚拟化的区别?
kvm虚拟化:需要硬件的支持,通过模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
1.Linux开机启动流程:
bios开机硬件自检 basic input output system
根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 读取grub(mbr)引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,加载内核
启动第一个进程/sbin/init systemd
系统初始化完成 运行服务(nginx,httpd,mysql) 。。。
2.容器启动流程: 共用宿主机内核,第一个进程直接启动服务(nginx,httpd,mysql)
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
xx. 应用之间的隔离
Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离。实现资源隔离的核心技术就是 Linux namespace。这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace)。
隔离意味着可以抽象出多个轻量级的内核(容器进程),这些进程可以充分利用宿主机的资源,宿主机有的资源容器进程都可以享有,但彼此之间是隔离的,同样,不同容器进程之间使用资源也是隔离的,这样,彼此之间进行相同的操作,都不会互相干扰,安全性得到保障。
为了支持这些特性,Linux namespace 实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。
操作系统层面
3. 容器技术历史
1)chroot技术,新建一个子系统(拥有自己完整的系统文件)
参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ chang root
实战1:使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls)
https://linux.cn/article-8313-1.html ldd /bin/ls
2)linux容器(lxc)
linux container(namespaces 命名空间 隔离环境 及cgroups 进程资源限制)
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
kvm虚拟机:资源限制(1c 1G 20G)
需要使用epel源
yum install epel-release -y
编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
安装lxc
yum install lxc-* -y yum install libcgroup* -y yum install bridge-utils.x86_64 -y
桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
启动cgroup
systemctl start cgconfig.service
启动lxc
systemctl start lxc.service
创建lxc容器
方法1: lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2: lxc-create -t centos -n test
为lxc容器设置root密码:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd Changing password for user root. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.
为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
启动容器
lxc-start -n centos7
### 3):docker容器
centos7.6 2G 10.0.0.11 docker01 host解析 centos7.6 2G 10.0.0.12 docker02 host解析
docker 初期把lxc二次开发,libcontainer
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。 namespace 资源隔离 cgroups 进程的资源限制 kvm 虚拟磁盘文件,资源隔离 kvm 资源限制,–cpus --memory
4. 安装Docker引擎
~]# uname -r # 确认内核版本,要求大于3.8
3.10.0-862.el7.x86_64
1.卸载遗留的
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.准备yum源
~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
~]# sudo yum makecache fast
~]# sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
$ yum list docker-ce --showduplicates | sort -r
3.安装docker-ce
~]# sudo yum install docker-ce docker-ce-cli containerd.io
4.初始化配置
~]# mkdir /etc/docker
~]# cat /etc/docker/daemon.json
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.64.9.1/20",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {"max-size":"256M", "max-file":"3"},
"live-restore": true
}
~]# mkdir -p /data/docker
~]# systemctl start docker && systemctl enable docker
~]# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.13
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1062.18.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.7GiB
Name: localhost
ID: JNFV:OTWO:QH5P:PZVS:NXOH:2W2D:E435:2AVF:UXEX:BZ5H:2X4K:ZWAI
Docker Root Dir: /data/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
registry.access.redhat.com
quay.io
127.0.0.0/8
Registry Mirrors:
https://q2gr04ke.mirror.aliyuncs.com/
Live Restore Enabled: true
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
配置详解:
# daemon.json 配置介绍
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.64.9.1/20",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {"max-size":"256M", "max-file":"3"},
"live-restore": true
}
# 配置项注意点:
# graph: 该关键字未来将被弃用,可以采用 "data-root" 替代
# storage-driver: 存储驱动,即分层文件系统
# insecure-registries: 不安全的docker registries,即使用http协议推拉镜象
# registry-mirrors: 加速站点,一般可以使用阿里、网易云、docker中国(https://registry.docker-cn.com)的地址
# bip: 指定docker bridge地址(不能以.0结尾),生产中建议采用 172.xx.yy.1/24,其中xx.yy为宿主机ip后四位,方便定位问题
# 若启动失败,查看 /var/log/message 日志排错
# max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
5. Docker组成部分
Docker 主机(Host): 一个物理机或虚拟机,用于运行 Docker 服务进程和容器。
Docker 服务端(Server): Docker 守护进程, 运行 docker 容器。
Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用 docker API。
Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系
Docker 镜像(Images): 镜像可以理解为创建实例使用的模板。
Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。
docker是传统的CS架构分为docker client和docker server,和mysql一样
$查看docker版本:
~]# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
docker主要组件有:镜像、容器、仓库, 网络,存储
6. 启动第一个容器
~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
2.启动Nginx容器
docker run -d -p 80:80 nginx
run(创建并启动一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
7. Docker镜像管理
官方镜像仓库地址:hub.docker.com
1. 登录仓库
~]# docker login docker.io
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: chengyinwu
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
登录信息:
~]# cat /root/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "xxxxxxxxxxxxxxxxxxx"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.13 (linux)"
}
}
2. 搜索镜像
选镜像的建议:
1,优先考虑官方
2,stars数量多
~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13757 [OK]
3. 下载镜像
~]# docker pull alpine #默认会下载最新版
Using default tag: latest
latest: Pulling from library/alpine
df20fa9351a1: Pull complete
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
~]# docker pull alpine:3.10 #指定版本
3.10: Pulling from library/alpine
21c83c524219: Pull complete
Digest: sha256:f0e9534a598e501320957059cb2a23774b4d4072e37c7b2cf7e95b241f019e35
Status: Downloaded newer image for alpine:3.10
docker.io/library/alpine:3.10
私有仓库pull
docker pull daocloud.io/huangzhichong/alpine-cn:latest
4. 查看镜像列表
docker images && docker image ls
5.给镜像打标签
~]# docker tag a24bb4013296 docker.io/chengyinwu/alpine:v3.12.0
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chengyinwu/alpine v3.12.0 a24bb4013296 3 months ago 5.57MB
alpine latest a24bb4013296 3 months ago 5.57MB
alpine 3.10 be4e4bea2c2e 4 months ago 5.58MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
6. 推送镜像
~]# docker push docker.io/chengyinwu/alpine:v3.12.0
7. 删除镜像
~]# docker rmi be4e4bea2c2e #镜像ID
~]# docker rmi -f $镜像ID #强制删除
8. 导出镜像
docker save
docker image save centos:latest -o docker-centos7.4.tar.gz
9. 导入镜像
docker load
docker image load -i docker-centos7.4.tar.gz
===============================================================================================
总结:
docker search php 在官方仓库中获取镜像
docker pull nginx 拉取Nginx镜像
docker images 查看所有镜像
docker image import docker_centos6.9.tar.gz 导入镜像但不带镜像名称和版本号
docker image load -i docker_alpine3.9.tar.gz 导入镜像
docker image save nginx:latest -o /tmp/docker_nginx.tar.gz 导出镜像
docker rmi busybox:latest 删除镜像
docker image history nginx 查看镜像历史
docker image tag a19653214294 centos:6.9 给镜像设定名称版本号
8. Docker容器管理
1. 查看容器列表
docker ps(-a -l -q)
2. 启动容器
~]# docker run -it chengyinwu/alpine:v3.12.0 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:40:00:01 brd ff:ff:ff:ff:ff:ff
inet 172.64.0.1/20 brd 172.64.15.255 scope global eth0
valid_lft forever preferred_lft forever
非交互式启动容器:
~]# docker run --rm chengyinwu/alpine:v3.12.0 /bin/echo hello
hello
非交互式启动后台容器:
~]# docker run -d --name myalpine chengyinwu/alpine:v3.12.0 /bin/sleep 3000
~]# ps aux|grep sleep|grep -v grep #宿主机
root 11240 0.0 0.0 1560 244 ? Ss 13:20 0:00 /bin/sleep 3000
~]# docker exec -it myalpine2 /bin/sh #容器内
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sleep 3000
11 root 0:00 /bin/sh
16 root 0:00 ps
docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh 覆盖容器的初始命令
--rm 退出后即删除容器
3. 运行容器
docker run image_name
docker run 等同于 docker create + docker start
4. 启动/停止/重启容器
docker start/stop/restart $容器ID/名字
5. 删除容器
docker rm $容器ID/名字
批量删除容器[强制]
docker rm -f `docker ps -a -q`
6. 杀死容器
docker kill container_name
7. 导出容器
~]# time docker export 8b30cef01b79 |gzip > onebox_V109.296.tar.gz
8. 提交容器
~]# docker exec -it myalpine3 /bin/sh
/ # echo 'i love you' >1.txt
/ # exit
~]# docker commit -p myalpine3 chengyinwu/alpine:v3.12.0_with_1.txt
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chengyinwu/alpine v3.12.0_with_1.txt 8f4306ba0513 6 seconds ago 5.57MB
9. 进入正在运行的容器
(目的:调试,排错)
*** docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
总结:
Docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住)
否则这个容器,就会处于退出状态!
业务在容器中运行:初始命令一定要夯住并且启动服务
例如:
nginx -g 'daemon off;'
/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf
===================================================================================
docker create centos:6.9 创建一个容器
docker start 4a0ab8445501 启动容器
docker stop 4a0ab8445501 停止一个容器
docker restart 20da4e87d10f 重启一个容器
docker ps:查看容器,默认查看正在运行的
-a:查看所有容器
-l:查看最新的容器
-q: 查看所有容器的id
docker run -d nginx:latest:创建运行一个容器相当于 create+start
-d:将程序放在后台执行
-p:指定映射端口
-v:指定将宿主机文件挂载到容器中的指定文件
docker rm b3d15ddb5f97 删除一个容器[id]
-f:强制删除
docker rm -f `docker ps -a -q` 批量删除
docker kill 20da4e87d10f 杀死一个容器
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) 进入正在运行的容器
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q
docker exec -it heuristic_buck /bin/bash 开启一个新的会话窗口并进入一个容器
docker attach 20da4e87d10f 使用同一个会话窗口并进入容器
docker rename heuristic_buck yiliao 修改容器的名称
docker logs yiliao 查看容器的终端输出(日志)
docker cp 容器:宿主机
docker diff 比对容器修改的操作
docker export ID 导出容器
docker import ID 导入容器
9. Docker容器日志
[root@localhost ~]# docker run hello-world 2>&1 >>/dev/null
[root@localhost ~]# docker ps -a|grep hello
2ca84422d34e hello-world "/hello" 12 seconds ago Exited (0) 11 seconds ago funny_dhawan
[root@localhost ~]# docker logs -f 2ca84422d34e
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
10. Docker容器网络
1. docker默认使用nat网络,使用命令-p指定,docker会自动添加iptables规则实现端口映射
2. 映射80端口到容器的80端口---81到81:
docker run -d -p 80:80 -p 81:81 nginx:latest
3. 多容器使用80端口
添加IP地址:
ifconfig eth0:0 10.0.0.12 up
ifconfig eth0:1 10.0.0.13 up
映射:
docker run -d -p 10.0.0.11:80:80 nginx:latest
docker run -d -p 10.0.0.12:80:80 nginx:latest
docker run -d -p 10.0.0.13:80:80 nginx:latest
4. 随机端口映射:
随机端口映射到容器的80
docker run -d -p ::80 nginx:latest
docker run -d -P nginx:latest
随机端口映射udp
docker run -d -p ::80/udp nginx:latest
11. Docker数据卷管理
1. 宿主机挂容器
nginx 默认站点目录: /usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html #指定宿主机的目录挂载到容器的目录
~]# docker run -d -p 80:80 -v /opt/xiaoniao/:/usr/share/nginx/html nginx:latest
2.持久化
数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
3.数据卷容器 `--volumes-from`(跟某一个已经存在的容器挂载相同的卷)
~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65c952f4a88b nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp romantic_wozniak
~]# docker run -d -p 81:80 --volumes-from 65c952f4a88b nginx:latest
562625b3d4cb177e46c5a98d95b3884889686121fad3b9b903f8864c1fe80353
通过浏览器访问81端口;
4. 需求:
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx 基于nginx多端口的多站点。
方案一:本地+容器
[root@docker01 ~]# docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest
df41ae2b61d286521f3bf8a0bcf1df7865af1dcf78796f824a18a6f15711584a
[root@docker01 ~]# docker exec -it df41ae2b61d2 /bin/bash
root@df41ae2b61d2:/# cd /etc/nginx/conf.d/
root@df41ae2b61d2:/etc/nginx/conf.d# cat xiaoniao.conf
server {
listen 81;
server_name localhost;
root /opt;
location / {
index index.html index.htm;
}
}
方案二:将本地文件或目录挂载到容器的文件或目录中:
[root@docker01 xiaoniao]# docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao:/opt -v /opt/xiaoniao/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf nginx:latest
浏览器分别访问82和83端口进行测试
5. 创建卷:
docker run -d -p 80:80 -v test:/usr/share/nginx/html nginx:latest
docker volume ls 查看卷
11. 重启docker服务,容器退出的解决方案
方法一:
docker run --restart=always
方法二:
"live-restore": true
配置文件/etc/docker/daemon.json
参考 { "registry-mirrors": ["http://b7a9017d.m.daocloud.io"], "insecure-registries":["10.0.0.11:5000"], "live-restore": true }
12. 传递环境变量
~]# docker run --rm -e E_OPTS=abcdefg chengyinwu/nginx:v1.18 printenv
HOSTNAME=46f23d17790b
HOME=/root
PKG_RELEASE=1~buster
NGINX_VERSION=1.18.0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=0.4.2
PWD=/
E_OPTS=abcdefg
13. 容器内安装软件
~]# docker run -it --rm chengyinwu/nginx:v1.18 bash
root@7452bd1f75aa:/# cat /etc/issue
Debian GNU/Linux 10 \n \l
root@7452bd1f75aa:/# echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security stretch/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security stretch/updates main contrib non-free' >/etc/apt/sources.list
root@7452bd1f75aa:/# apt-get update
root@7452bd1f75aa:/# apt-get install curl -y
~]# docker commit -p 2d502a945c18 chengyinwu/nginx:curl
~]# docker push chengyinwu/nginx:curl
14. Docker网络类型(插件形式)
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--network=host 性能最高
Bridge:Docker设计的NAT网络模型 默认类型.
1.查看运行的容器网络信息
[root@docker01 ~]# docker inspect e70282f6414f
docker network ls 列出容器所有网络
--network=host
host 直接使用宿主机的网络【ip和主机名都一样】
docker run -it --network=none alpine:3.9 [没有网卡]
2.创建bridge网络
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 cheng
3.基于cheng网络启动一个容器,测试是否能正常上网
15. Docker命令总结
1. container命令
attach 不分配新终端进入容器
create 创建一个新容器
export 导出容器为镜像文件,但镜像没有标签,使用import可导入
logs 查看容器的终端输出,可在容器秒死时查看原因
port 查看容器映射端口
restart 重启容器
start 启动容器
top 查看容器中的进程信息
wait 夯住直到容器停止,然后打印容器的退出代码
commit 提交容器为镜像
diff 查看容器与初始镜像的文件变化
inspect 查看容器的属性信息
ls 查看容器列表
prune 清除没有运行的容器
rm 删除容器
stats 查看容器占用资源的情况
unpause 接触容器暂停状态
cp 从宿主机和容器之间拷贝文件
exec 进入容器
kill 强制停止容器
pause 暂停容器
rename 修改容器的名称
run 创建并运行容器
stop 停止容器
update 更新修改容器的资源限制
2. image命令
build dockerfile 构建镜像
history 查看镜像的历史记录
import 导入镜像,但没有标签
inspect 查看镜像的属性信息
load 导入镜像
ls 查看镜像列表
prune 清除失败的镜像缓存
pull 从官方仓库拉取镜像
push 推送镜像至官方仓库
rm 删除镜像
save 导出镜像为镜像文件
tag 修改镜像的标签