Docker①

Docker

  • 1. 什么是Docker?
  • 2. Docker安装
  • 3. 在Docker中部署nginx
  • 4. Docker基础命令
  • 5. 使用Dockerfile构建Docker镜像
    • 5.1 构建自定义nginx镜像
    • 5.2 构建自定义容器卷镜像

Docker①_第1张图片

1. 什么是Docker?

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker架构图:
Docker①_第2张图片
Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

2. Docker安装

配置yum源

 yum install -y yum-utils device-mapper-persistent-data lvm2
 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看yum仓库中,docker版本

yum list docker-ce --showduplicates |sort -r

默认安装最新版本

yum makecache fast
yum -y install docker-ce

启动docker并配置docker镜像源,然后重启生效
点击:阿里云容器国内镜像加速地址
进去后复制加速地址
systemctl start docker
cd /etc/docker
vim daemon.json //如果有该文件,则修改,没有则创建
{
“registry-mirrors”:[“https://m9r2r2uj.mirror.aliyuncs.com”]
}

查看docker版本

[root@docker_test ~]# docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        2d0083d
 Built:             Thu Jun 27 17:56:06 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       2d0083d
  Built:            Thu Jun 27 17:26:28 2019
  OS/Arch:          linux/amd64
  Experimental:     false

将image文件从仓库抓到本地

docker pull library/hello-world

查看image

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        6 months ago        1.84kB

运行这个image文件

docker run hello-world

3. 在Docker中部署nginx

查看仓库中的nginx

	[root@docker_test ~]# docker search nginx
	NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
	nginx                             Official build of Nginx.                        11704               [OK]                
	jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1628                                    [OK]
	richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   726                                     [OK]
	bitnami/nginx                     Bitnami nginx Docker Image                      69                                      [OK]
	linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   69                                      
	........		                  ........
 
列出镜像,没有nginx镜像

	[root@docker_test ~]# docker images
	REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
	hello-world         latest              fce289e99eb9        6 months ago        1.84kB

执行docke 运行命令,自动查看是否有该镜像,如果有则直接运行,没有就安装后再运行

	[root@docker_test ~]# docker run -p 91:80 nginx 
	Unable to find image 'nginx:latest' locally
	latest: Pulling from library/nginx
	fc7181108d40: Pull complete 
	d2e987ca2267: Pull complete 
	0b760b431b11: Pull complete 
	Digest: sha256:48cbeee0cb0a3b5e885e36222f969e0a2f41819a68e07aeb6631ca7cb356fed1
	Status: Downloaded newer image for nginx:latest
	
	-p 91:80
    //docker是依赖于LXC的高级容器引擎,91端口是宿主机映射到docker容器中nginx的80端口。
	//client可以通过docker命令来操控宿主机去管理docker容器,但是不能直接操作docker容器
	//我们需要将宿主机的端口映射到容器中,通过访问宿主机来访问docker容器。

上条命令为了演示效果,没有放到后台运行,我们新开一个终端,列出当前正在运行的容器

	[root@docker_test ~]# docker ps 
	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
	f4754abb3825        nginx               "nginx -g 'daemon of…"   7 minutes ago       Up 7 minutes        0.0.0.0:91->80/tcp   adoring_hofstadter

终止,并放入后台运行

	[root@docker_test ~]# docker run -d -p 91:80 nginx 
	92418675f5b965996aca93cd1114ead6bad26034ac9e6fbf55cff168857bdb00

在浏览器通过访问宿主机的ip+91端口,即可访问到docker容器内的nginx
Docker①_第3张图片

4. Docker基础命令

安装java8镜像:

docker pull java:8

列出宿主机上的镜像:

docker images

停止容器

docker stop 容器ID(可通过docker ps -n 数字    查看历史运行过的容器)

强制停止容器

docker kill 容器ID

启动已经停止的容器

docker start 容器ID

查看容器所有信息

docker inspect 容器ID

查看容器日志

docker container logs 容器ID

查看容器里的进程

docker top 容器ID

进入容器可做相关配置,权限极低,不建议使用

	docker container exec -it 容器ID /bin/bash
	[root@docker_test ~]# docker exec -it 92418675f5b9 /bin/bash
	root@92418675f5b9:/# ls
	bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

当想启动相同名称的容器时,会报错:

	docker: Error response from daemon: Conflict. The container name "/mycentos" is already in use by container "c44e71c3799547e22f1bac2ebc444b66b26721f291b9b6ffc0b91ee3f2d66533". You have to remove (or rename) that container to be able to reuse that name.
	See 'docker run --help'.

	意思就是说,这个名字已经运行了一个容器了,如果想用相同名称再运行一个容器,必须将之前的容器给删掉。
	通过 docker ps查看,发现没有正在运行的容器。
	原来是通过 docker ps -l 找到之前的容器ID,再使用dokcer rm 容器ID删除即可。

在容器内部安装软件(命令),例如安装vim

	//先要进入容器
	[root@docker_test ~]# docker exec -it 92418675f5b9 /bin/bash
	
	//在容器内部安装vim
	root@92418675f5b9:/# apt-get install vim
	此时会报错:
		Reading package lists... Done
		Building dependency tree       
		Reading state information... Done
		E: Unable to locate package vim

	//我们应该先执行apt-get update,待更新完成后再执行apt-get install vim。
	root@92418675f5b9:/# apt-get update
	......过程省略......
	root@92418675f5b9:/# apt-get install vim

	//注意:apt-get为固定格式,没有yum命令

5. 使用Dockerfile构建Docker镜像

5.1 构建自定义nginx镜像

刚刚我们在docker中部署了一个官方的nginx容器,我们现在通过Dockerfile来自定义一个nginx容器。

先来简单介绍一下Dockerfile,Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。

新建一个nginx_app目录,在当前目录下生成一个Dockerfile文件,添加以下内容

	[root@docker_test nginx_app]# pwd
	/root/nginx_app
	[root@docker_test nginx_app]# vim Dockerfile
	FROM nginx
	RUN echo '

It‘s in RunTu's house!!!!</h1>' > /usr/share/nginx/html/index.html //FROM、RUN都是Docker的指令。FROM指令用于指定基础镜像,RUN指令执行命令 //lnginx容器的默认首页位置:/usr/share/nginx/html/index.htm 可以进入该容器中验证。 [root@docker_test ~]# docker container exec -it 92418675f5b9 /bin/bash root@92418675f5b9:/# ls /usr/share/nginx/html/ 50x.html index.html

利用Docker模板文件来构建nginx镜像

	[root@docker_test ~]# docker build -t nginx:lizhao /root/nginx_app
	Sending build context to Docker daemon  2.048kB
	Step 1/2 : FROM nginx
	 ---> f68d6e55e065
	Step 2/2 : RUN echo "

It is in RunTu's house!!!!

"
> /usr/share/nginx/html/index.html ---> Running in 7ec0ac0bcee2 Removing intermediate container 7ec0ac0bcee2 ---> aa639d1e0e34 Successfully built aa639d1e0e34 Successfully tagged nginx:lizhao //-t指定镜像名字,/root/nginx_app为Dockerfile文件所在路径 执行启动命令,即可使用该镜像启动一个Docker容器 [root@docker_test ~]# docker run -d -p 92:80 nginx:lizhao 8e5081841d15afb60e15b8b02331bad529e9946bbe49781a43dd2ba83ac8e1b4 列出正在运行中的容器,发现有两个nginx容器,一个是之前开启的官方nginx,还有一个是我们自己构建的nginx容器 [root@docker_test ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8e5081841d15 nginx:lizhao "nginx -g 'daemon of…" 49 seconds ago Up 48 seconds 0.0.0.0:92->80/tcp friendly_lovelace 92418675f5b9 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:91->80/tcp awesome_newton

同样的道理,我们在浏览器输入宿主机的ip+92端口,就可以访问到我们自己构建的nginx容器的80端口
Docker①_第4张图片

5.2 构建自定义容器卷镜像

容器卷:实现容器上的数据持久化和容器数据共享。
可理解为将宿主机上路径挂载到容器内的某一路径。

docker run -it -v /宿主机的绝对路径:/容器内部的路径 镜像名

当然我们也可以利用Dockerfile文件自定义构建容器卷镜像。

//查看Dockerfile文件内容。并启构建
	
	[root@localhost ~]# cat Dockerfile 
	FROM centos
	VOLUME ["/datavomule_test01","/datavolume_test02"]
	CMD echo "finished------------sucessful"
	CMD /bin/bash

	[root@localhost ~]# docker build -t lz/centos -f /root/Dockerfile .
	构建过程省略。。。。
//启动该容器卷
	
	[root@localhost ~]# docker run -it --name lzcentos lz/centos
	[root@22c90695e855 /]# ls
	anaconda-post.log  datavolume_test02  dev  home  lib64  mnt  proc  run   srv  tmp  var
	bin                datavomule_test01  etc  lib   media  opt  root  sbin  sys  usr
	//可查看到lz/centos容器内已经自动创建了两个挂载目录。

//查看容器的详细信息

	[root@localhost ~]# docker inspect 22c90695e855|grep Source
                "Source": "/var/lib/docker/volumes/cf91aa2ecaea6393478c1188f1334145b1b7aa149d282fca3347d88cf051b229/_data",
                "Source": "/var/lib/docker/volumes/737b42dd7c566cd21991b3c083525a02619ae403480b57ba14b0c1678a136966/_data",

	//在我们没有指定宿主机的路径时,dokcer会默认生成一个挂载路径。可以通过查看容器的详细信息找到该路径。

你可能感兴趣的:(Linux服务)