初识docker容器

  1. go编写,13年诞生,开源
  2. 主流操作系统都支持docker,包括Windows和macos
  3. 云厂商都支持docker的服务
  4. 一次封装,到处运行

1.安装docker

核心概念

镜像(image)

  • 类似于虚拟机镜像,但是它只是只读的(read-only)
  • 文件和meta data的集合(root filesystem)
  • 分层的,并且每一层都可以添加改变删除文件,成为一个新的image
  • 镜像包含最基本的操作系统,里面仅仅安装apache应用程序(或者其它),称之为apache镜像
  • 镜像是创建容器的基础

容器(Container)

容器是从镜像创建的应用运行实例

仓库(Repository)

  • Docker仓库类似于代码仓库,是Docker级中存放镜像文件的场所
  • 分为:公开仓库(public)和私有仓库(private)
    • 最大的是官方的Docker Hub
    • 国内的腾讯云,阿里云
    • 支持本地创建私有仓库

设置存储库

安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。

yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装DOCKER引擎

  1. 安装最新版本的Docker Engine和容器,或转到下一步以安装特定版本:
##知识点:docker-ce 和 docker -ee 等版本的区别
yum install docker-ce docker-ce-cli containerd.io
#启动Docker
systemctl start docker
#通过运行`hello-world` 映像来验证是否正确安装了Docker Engine 。
docker run hello-world
#卸载Docker
#卸载Docker Engine,CLI和Containerd软件包:
yum remove docker-ce docker-ce-cli containerd.io
#主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
rm -rf /var/lib/docker
#您必须手动删除所有已编辑的配置文件。

Docker 使用

## 列出本地镜像。
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。

需要确认容器有在运行,可以通过 docker ps 来查看

#正在运行的容器可以使用
docker ps 
#已经退出了和正在运行的容器使用
docker ps -a  

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
8344d22e55a7        hello-world         "/hello"            17 minutes ago      Exited (0) 17 minutes ago                       mystifying_panini
输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

查看容器的基本信息

#可以查看版本,docker --version也可以
docker info

docker镜像

官方的Docker Hub 网站已经提供了N多镜像

## 查看
docker search CentOS
## 如果不换版本号,会使用最新版本的镜像 latest版本
docker pull centos:7 
docker[image] pull NAME [ :TAG]

下载很慢的话,可以设置一个国内的docker hub代理 如下

##这个文件本身是没有的 所以用vim
cat /etc/docker/daemon.json

{
"registry-mirrors":[
			"https://docker.mirrors.ustc.edu.cn",
			"https://registry.docker-cn.com"
]
}
##接着重启docker生效
systemctl daemon-reload
systemctl restart docker

运行centos镜像为容器

##将镜像运行成容器,同时进入容器运行/bin/bash
docker run -it centos:7 /bin/bash
#关于参数,可以使用 docker run --help 查看
想进入某一容器,复制它的id号
如果已退出,则 docker start [CONTAINER ID]
然后在进入容器  docker exec -it [CONTAINER ID] /bin/bash
## docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

如何查看镜像信息?

  • 列出镜像
docker images
docker image ls
  • tag添加不同标签
docker tag centos:7 lampp:v1
docker images #会发现两个镜像id一样
  • inspect命令查看详细信息
docker inspect lampp:v1
##如果只查一个信息
docker inspect lampp:v1 -f {{".ContainerConfig"."Hostname"}}
  • history命令查看镜像历史
docker history lampp:v1 --notrunc
  • 删除清理镜像
docker rmi
docker image rm
##参数 -f 强制删除,即便它有容器依赖
## 参数 -no-prune 不要清理未带标签的父镜像
docker image prune -a -f
## 删除遗留的临时镜像文件,以及一些没有被使用的镜像
## -a 删除所有无用镜像
## -f 不进行提示,有点像rm -rf
  • 创建镜像
  • 将现有的容器变成镜像
  • 模板倒入
  • Dockerfile
#将现有容器变成镜像
docker run -it centos:7 /bin/bash
yum install httpd  ##进入容器安装服务
exit

docker ps -a
docker commit -m "Add httpd" -a "huangchao" 15961c18fb49 centos:v1
##参数 -m 提交信息
## -a 作者信息
docker inspect centos-httpd:v1 -f {{.Author}}
docker history centos-httpd:v1
#模板导入
#下载模板 
centos-7-x86_64-minimal.tar.gz

wget http://openvz.mirror.digitalpacific.com.au/template/precreated/centos-7-x86_64-minimal.tar.gz
#将模板导入变为镜像
cat centos-7-x86_64-minimal.tar.gz |docker import - centos7-min
#查看
docker images
#将镜像 centos7-min 运行为容器,进入到这个容器
docker run -itd centos7-min /bin/bash
docker ps
docker exec -it d7692b0efaad /bin/bash
#把镜像导出为一个文件
#docker save -o 文件名 镜像名
docker save -o peng-centos7.tar centos7-min
#将正在运行的容器删除
docker rm -f d7692b0efaad
#删除镜像
docker rmi centos7-min
#用文件恢复镜像
docker load < peng-centos7.tar
docker load --input peng-centos7.tar
#将自己的镜像传到dockerhub上去
docker push 镜像名
##Dockerfile 这是最常见的方式
vim Dockerfile
#将以下复制写入 Dockerfile
FROM contos:7
RUN yum install httpd -y &amp;&amp; echo "i'm huangchao httpd testing" > /var/www/html/index.html
EXPOSE 80
ENTRYPOINT(CMD) ["httpd", "-D" ,"FOREGROUND"]

docker build -t centos-httpd:v2 .
#查看是否成功
docker images 
#进去检查  --rm:运行报错或者退出容器,就会自动销毁删除
docker run -it --rm centos-httpd:v2 /bin/bash
#启动容器并映射端口
docker run --name httpd --rm -it -p 8888:80 -d centos-httpd:v2
##随机端口  -P 
(docker run --name httpdP --rm -it -P -d centos-httpd:v2)
#查看是否成功
docker ps
--------------------------------------
##启动容器
docker run -d centos-httpd:v2

导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

docker export 1e560fca3906 > ubuntu.tar

镜像的导出导入

我们可以把镜像导出到本地,然后传到其他机器上使用

docker save -o centos-httpd:v3.tar centos-httpd:v3
## :会当作域名解析,会传不过去
mv centos-httpd\:v3.tar centosv3.tar
##scp传送慢则修改配置文件
vim /etc/ssh/sshd_config
##修改
UseDns no 和 GSSAPIAuthentication no

systemctl restart sshd

scp centos-httpd:v2.tar root@172.0.0.1:/tmp

将传过来的镜像导入

docker load -i centos-httpd:v2.tar
或者
docker load -i <centos-httpd:v2.tar

镜像的上传

#1.在linux中登录
docker login
docker tag centos-httpd:v2 yl871012/centos:v2 #打标签
docker push yl871012/centos:v2 #上传
docker logout

使用Docker容器

  • 新建容器(略)
docker create -it centos:7
docker ps -a #状态是created
docker start [ID] #启动容器
docker exec -it [ID] /bin/bash
  • 查看容器输出
docker logs -f -t [ID]
# 参数 -f 持续保持输出
# -t 显示时间戳信息
  • 新建并启动容器
#守护态运行 -d 表示后台运行 
docker run --name test --rm -d -it centos:7
docker ps
  • 停止容器
#暂停容器
docker pause [ID]
#等待20s后停止容器
docker stop -t 20 [ID]
#重启容器
docker restart [ID]
  • 删除容器
#强制删除
docker rm xxx -f
  • 容器的导入导出
#导出
#不管容器是什么状态都可以导出,up或者exit状态都可以
docker export -o up_test.tar [ID]
或者
docker exprot [ID] >up_test.tar

#导入
#导入为镜像,命名为centos:v1.0
docker import up_test.tar -- centos:v1.0
  • 查看容器
docker inspect [ID] -f {{".NetworkSettings"."IPAddress"}}
# -f 过滤
  • 查看容器内进程
docker top [ID]
  • 查看统计信息
#单个容器状态
docker stats [ID]
#只刷新一次,有点像top命令
docker stats [ID] --no-stream
#所有容器
docker stats --all --format "table {{.CONTAINER}}\t{{.cpupERc}\t{{.MemUsage}}}"

load 和import有什么区别,都是导成镜像?

load 和import有什么区别,都是导成镜像?
1、import在导入数据的时候需要写入日志、load在导入数据的时候不需要写入日志。

2、import在导入数据的时候,目标表是可以进行访问和操作的,load只能进行select操作。

3、import在导入数据的时候,不能对索引模式进行选择,load可以。

4、import在导入数据的时候,不会使被导入数据表所属的表空间处于backup pending状态,而load会,当然如果load加nonrecoverable就可以避免表空间处于pending。

5、import在导入数据的时候,要进行各种约束性验证、触发器和参照完整性的约束,而load导入数据的时候只会进行性检查和非法值检查,不会进行完整性检查,不会调用触发器。

其他命令

  • 复制文件
docker cp Dockerfile [ID]:/
docker cp  [ID]:/Dockerfile  ./
  • 查看容器内文件的变更
docker diff [ID]
  • 更新配置
docker inspect [ID] -f {{".HostConfig"."Memory"}}
docker update  [ID] -m 128M --memory-swap -1
#或者在docker run时直接指定也可以
docker run -it -m 200M centos-httpd:v4 /bin/bash

Docker仓库

虽然官方有仓库,官方也提供了本地仓库的搭建,但是我们还是选择了vmware的harbor

安装docker-compose

官网安装

国内安装

curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

安装并配置harbor

官网

tar xvf harbor-offline-installer-v1.5.0.tgz
cd harbor/
vim harbor.cfg
# hostname=hub.tyyz.com
#ui_url_protocol=http
#harbor_admin_password=redhat
./install.sh
docker ps #查看启动了很多容器
docker-compose up -d #如果系统重启后,我们需要使用这个命令来启动harbor
#停止 do
docker-compose down -v

docker login http://hub.tyyz.com #在客户端登录harbor
docker tag hello-world:latest hub.tyyz.com/centos/hello-world:lastest #打标签
docker push hub.tyyz.com/centos/hell-world:latest #推到仓库
docker pull hub.tyyz.com/centos/hello-world:latest #在其他客户端上从仓库拉取镜像(得提前login)
##如果登不上,需要在客户端设置如下
vim /etc/docker/daemon.json
{
"insecure-registries":["hub.tyyz.com"]
}
systemctl daemon-reload
systemctl restart docker

cat /etc/docker/daemon.json
#所以daemon.json文件中应该有如下内容:
{
"registry-mirrors":[
			"https://docker.mirrors.ustc.edu.cn",
			"https://registry.docker-cn.com"
],
"insecure-registries":["hub.tyyz.com"]
}

#注意
docker中安装完httpd服务后,使用命令systemctl start httpd.service,发现报错,错误信息:Failed to get D-Bus connection: Operation not permitted
##--privileged=true  赋予root权限
解决方法:使用命令docker run -d --name centos7 --privileged=true centos:7 /usr/sbin/init
创建容器,然后使用docker exec -it centos7 /bin/bash进入容器


#启动容器并映射端口
docker run -d --name httpd --rm -it -p 8888:80 --privileged=true centos:7 /usr/sbin/init

docker run -d --name httpd  -it -p 8888:80 --privileged=true centos:7 /usr/sbin/init
#然后再进入  
docker exec -it centos7 /bin/bash


docker run -d --name httpda -it -p 8088:80 --privileged=true -v /var/www/html:/usr/local/apache2/htdocs httpd:latest /bin/bash

查看映射端口
docker port CONTAINER_ID

DOCKER 给运行中的容器添加映射端口

方法1
1、获得容器IP将container_name 换成实际环境中的容器名
docker inspect `container_name` | grep IPAddress

2.iptable转发端口,将容器的8000端口映射到docker主机的8001端口
iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

方法2:利用docker commit新构镜像

1、停止docker容器
docker stop container01

2、commit该docker容器
docker commit container01 new_image:tag
docker commit -m "Add httpd" -a "huangchao" 15961c18fb49 centos:v1

3、用前一步新生成的镜像重新起一个容器
docker run --name container02 -p 80:80 new_image:tag


--------------------------------------------------------
##先传到主机
scp uc.tar.gz root@172.24.79.7:/var/www/html
##主机在传入容器
docker cp /var/www/html/uc.tar.gz 28204adf5671:/var/www/html
##国内库下载mysql
docker pull daocloud.io/library/mysql:5.7
# 初始化密码 
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7

 docker run -itd -p 3306:3306  --name mysql5.7 -e MYSQL_ROOT_PASSWORD=redhat -v /var/mysqldata/my.conf:/etc/my.cof -v=/var/mysqldata:/var/lib/mysql mysql:5.7 /bin/bash

/var/lib/mysql
##启动nginx
docker run --name nginx-test -p 9999:80 -d daocloud.io/library/nginx:latest

“初识docker容器”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注