Docker容器高级操作

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启动一个容器,监听8081,访问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 
浏览器分别访问8283端口进行测试

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			修改镜像的标签

在这里插入图片描述

16. Docker容器化封装应用的好处

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻花之梦~~

谢谢老板的支持和鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值