Docker入门学习笔记

Docker由镜像(Image)、容器(Container)、仓库(Repository) 三大核心组成

优点:

更快速的交付和部署(使用docker,开发人员可以用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。)

更轻松的迁移和扩展(docker容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。可以在不同的平台轻松地迁移应用)

更简单的更新管理(使用Dockerfile,只需要修改小小的配置,就可以替代以往大量的更新工作)

安装Docker:

点击打开链接-官方安装文档

Ubuntu系统:

移除原有docker

sudo apt-get remove docker docker-engine docker.io

更新apt-get

sudo apt-get update

安装:

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

添加docker官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

确认密钥添加成功:

$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <[email protected]>
sub   4096R/F273FCD8 2017-02-22
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装最新版本docker:

sudo apt-get install docker-ce

CentOS系统:

如果在服务器上有旧版的docker,需要先执行卸载操作,如下:.

$ sudo yum remove docker \ 
                               docker-common \ 
                               docker-selinux \ 
                               docker-engine

随后开始安装Docker CE

 1 $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
 2 
 3 $ sudo yum-config-manager \
 4     --add-repo \
 5 https://download.docker.com/linux/centos/docker-ce.repo
 6 
 7 $ sudo yum-config-manager --enable docker-ce-edge
 8 
 9 $ sudo yum-config-manager --enable docker-ce-test
10 
11 $ sudo yum-config-manager --disable docker-ce-edge
12 
13 $ sudo yum makecache fast
14 
15 $ sudo yum install docker-ce
执行查询docker版本号,看是否安装成功
docker --version

正常情况下会出现如下视图

docker启动:

service docker start

docker开机自启动:

chkconfig docker on

注册DaoCloud账号,获取加速服务

直接从Docker官方往本地pull镜像会十分缓慢,可以通过国内的Docker服务提供商免费获取加速pull镜像服务。

DaoCloud:点我注册DaoCloud账号

登录后,点击右上角小火箭,配置加速器:

运行完命令,重启docker生效: sudo systemctl restart docker.service

Docker的架构:

Docker中可能涉及到3个机器或者更多机器,一个运行docker命令的client, 一个包含images并以容器(container)形式运行image的主机,一个docker的images仓库。client与docker host上面的docker daemon通信。当然docker client和host可以运行于一台机器。

理解其中几个概念:

  • Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build,docker pull...)和配置标识,并与Docker daemon通信
  • Images(Docker镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像
  • Containers(容器):镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象
  • Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub

一般的流程中,client发pull命令从仓库把image拉到docker host,然后通过run命令指挥image到host上面弄一个container来跑这个image。

Docker入门实践:

(1)下载镜像 image

在  Docker Hub 中搜索需要的镜像文件,确定版本后通过docker pull 命令拉取镜像文件 

也可通过docker search 命令查询镜像:

root@localhost:~# docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   7996                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                            Ubuntu with openssh-server and NoVNC            193                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   156                                     [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   93                                      [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   87                  [OK]                
neurodebian                                               NeuroDebian provides neuroscience research s…   50                  [OK]                
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   39                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          36                                      [OK]
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                              Simple Ubuntu docker images with SSH access     18                                      
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   13                                      
ppc64le/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   12                                      
1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        10                                      [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       7                                       [OK]
eclipse/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
codenvy/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]
darksheer/ubuntu                                          Base Ubuntu Image -- Updated hourly             4                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             3                                       [OK]
pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   1                                       
1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                                       [OK]
1and1internet/ubuntu-16-healthcheck                       ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              0                                       
smartentry/ubuntu                                         ubuntu with smartentry                          0                                       [OK]
ossobv/ubuntu                                             Custom ubuntu image from scratch (based on o…   0                                       
1and1internet/ubuntu-16-rspec                             ubuntu-16-rspec                                 0                                       [OK]

通过 docker pull 下载镜像文件:

docker pull ubuntu:14.04

下载完成后,docker images 查询镜像,可以看到刚刚下载的ubuntu14.04镜像文件:

root@localhost:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              2d084b11164d        12 days ago         463MB
ubuntu              14.04               578c3e61a98c        5 weeks ago         223MB

(2)启动镜像

通过下面的命令参数启动容器,

docker run <相关参数> <镜像 ID> <初始命令>

-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,
格式:-v <宿主机目录>:<容器目录>

root@localhost:~# docker run -it ubuntu:14.04 bash
root@2412e35ece02:/# 
root@2412e35ece02:/# 

还可以通过挂在方式运行镜像:

root@localhost:~# docker run -i -t -v /usr/local/software/:/usr/local/software/ ubuntu:14.04 /bin/bash
root@835c00126dbe:/# 

可以看到镜像中的指定目录已经自动挂载了宿主机的目录下的文件:

root@835c00126dbe:/usr/local/software# ll
total 182344
drwxr-xr-x 2 root root      4096 Jul 17 01:01 ./
drwxr-xr-x 1 root root      4096 Jul 17 01:06 ../
-rw-r--r-- 1 root root   8886737 Jul 17 00:56 apache-tomcat-7.0.67.tar.gz
-rw-r--r-- 1 root root   4092400 Jul 17 01:00 bcprov-jdk15on-159.jar
-rw-r--r-- 1 root root     59626 Jul 17 01:00 cryptest.sql
-rw-r--r-- 1 root root  19214440 Jul 17 01:00 cryptest.war
-rw-r--r-- 1 root root 153530841 Jul 17 00:55 jdk-7u80-linux-x64.tar.gz
-rw-r--r-- 1 root root    520208 Jul 17 01:00 libcertVerify.so
-rw-r--r-- 1 root root     17672 Jul 17 01:00 libipsecProTest.so
-rw-r--r-- 1 root root    158376 Jul 17 01:00 service
-rw-r--r-- 1 root root    205701 Jul 17 01:00 wdgmdect.CAB

通过docker ps 可查看正在运行的容器:

root@localhost:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2412e35ece02        ubuntu:14.04        "bash"              2 minutes ago       Up 2 minutes                            heuristic_meitner

现在进入的是ubuntu镜像所运行的容器中,所有操作都是在此容器中进行,与宿主机隔离。

(3)安装jdk和tomcat环境

 mkdir /data
 tar -zxvf jdk-7u80-linux-x64.tar.gz -C /data/
 tar -zxvf apache-tomcat-7.0.67.tar.gz -C /data/
 cd /data/
 mv jdk1.7.0_80/ jdk/
 mv apache-tomcat-7.0.67/ tomcat/

配置环境变量

vi /etc/profile

添加下面的配置:

export JAVA_HOME=/data/jdk   
export JRE_HOME=${JAVA_HOME}/jre   
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib   
export PATH=${JAVA_HOME}/bin:$PATH

export CATALINA_HOME=/data/tomcat  
export CATALINA_BASE=/data/tomcat

保存并退出,设置立即生效:

source /etc/profile

启动tomcat时必须通过TOMCATHOME/bin/catalina.sh实现,不能使用TOMCAT_HOME/bin/startup.sh启动,否则脚本执行后容器会马上退出。

vi /data/start.sh

添加以下内容:

#!/bin/bash
# Export environment variable
source /etc/profile
# Start tomcat
bash /data/tomcat/bin/catalina.sh run

添加可执行权限:

chmod u+x /data/start.sh

(4)保存,构建镜像  commit方式

创建新镜像:

root@localhost:/usr/local/software# docker commit 835c00126dbe wuts/ubuntu_javaweb

sha256:5f333d72037000e632fa559c1f3f72d941d6f47318d772a27c2af77d1a31d649

完成后,查询可见新镜像:

root@localhost:/usr/local/software# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
wuts/ubuntu_javaweb   latest              5f333d720370        11 seconds ago      609MB
tomcat                latest              2d084b11164d        13 days ago         463MB
ubuntu                14.04               578c3e61a98c        5 weeks ago         223MB

 新镜像中配置好了jdk环境以及tomcat服务器。

(5)运行新镜像

root@localhost:/usr/local/software# docker run -it -p 18080:8080 wuts/ubuntu_javaweb /bin/bash
root@4118c10fabe8:/# 
root@4118c10fabe8:/# 
root@4118c10fabe8:/# 

启动后可查看是否启动成功:

root@localhost:~# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED              STATUS              PORTS                     NAMES
4118c10fabe8        wuts/ubuntu_javaweb   "/bin/bash"         About a minute ago   Up About a minute   0.0.0.0:18080->8080/tcp   wizardly_benz

遇见一个问题,启动之后  /etc/profile 文件里的jdk和tomcat未生效,需要重新source  /etc/profile一下就好了。

在容器中启动tomcat:

root@58dd0c8ee341:/data# ./tomcat_start.sh 

在局域网中访问容器宿主机的ip地址,端口号为启动时映射的端口号18080,成功访问tomcat页面

(5)保存,构建镜像  dockerfile方式

新建文件夹:/docker/myimage/

新建文件Dockerfile,加入如下内容

FROM wuts/ubuntu_javaweb
MAINTAINER wuts <[email protected]>

指定docker built命令生成自定义镜像:

root@localhost:/docker/myimage# docker build -t my/javaweb:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM wuts/ubuntu_javaweb
 ---> 5f333d720370
Step 2/2 : MAINTAINER wuts <[email protected]>
 ---> Running in 0b847d3ab3b0
Removing intermediate container 0b847d3ab3b0
 ---> 61ad89d0b68e
Successfully built 61ad89d0b68e
Successfully tagged my/javaweb:v1

查看新生成的镜像:

root@localhost:/docker/myimage# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
my/javaweb            v1                  61ad89d0b68e        2 minutes ago       609MB
wuts/ubuntu_javaweb   latest              5f333d720370        About an hour ago   609MB
tomcat                latest              2d084b11164d        13 days ago         463MB
ubuntu                14.04               578c3e61a98c        5 weeks ago         223MB

启动新建镜像:

root@localhost:/docker/myimage# docker run -it -p 18080:8080 my/javaweb:v1 /bin/bash
root@a79deaa1a2f3:/# 

Dockerfile指令:

1、FROM

格式:FROM <image>或 FROM <image>:<tag>

第一条指令必须为FROM指令,并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)

2、MAINTAINET

格式:MAINTAINET <name>

指定维护者的信息

3、RUN

格式:RUN <command> 或 RUN ["", "", ""]

每条指令将在当前镜像基础上执行,并提交为新的镜像。(可以用“\”换行)

4、CMD

格式:CMD ["","",""]

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条指令,则最后一条执行。(会被启动时指定的命令覆盖)

5、EXPOSE

格式:EXPOSE <port>  [ <port> ...]

告诉Docker服务端暴露端口,在容器启动时需要通过 -p 做端口映射

6、ENV

格式:ENV <key> <value>

指定环境变量,会被RUN指令使用,并在容器运行时保存

7、ADD

格式:ADD  <src>  <dest>

复制指定的<src>到容器的<dest>中,<src>可以是Dockerfile所在的目录的一个相对路径;可以是URL,也可以是tar.gz(自动解压)

8、COPY

格式:COPY <src>  <dest>

复制本地主机的 <src> ( 为 Dockerfile 所在目录的相对路径)到容器中的 <dest> (当使用本地目录为源目录时,推荐使用 COPY)

9、ENTRYPOINT

格式:ENTRYPOINT ["","",""]

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。(每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效)

10、VOLUME

格式:VOLUME ["/mnt"] 

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

11、USER

格式:USER daemon

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

12、WORKDIR

格式:WORKDIR /path/to/workdir

为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。(可以使用多个 WORKDIR	指令,后续命令如果参数是相对路径, 则会基于之前命令指定的路径)

13、ONBUILD

格式:ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

 

总结:

docker简单入门体验实践完成,了解了docker基本操作流程

docker命令需要sudo ,普通用户可加入docker用户组,即可省略sudo,本文中直接root用户测试。

添加一个新的docker用户组
sudo groupadd docker
# 添加当前用户到docker用户组里
sudo gpasswd -a wuts docker
# 重启Docker后台监护进程
sudo service docker restart
# 重启之后,尝试一下,是否生效

docker version

Docker常用命令:

Docker run命令文档:

点击打开链接

# 下载一个ubuntu镜像 
sudo docker pull ubuntu
# 使用ubuntu运行一个交互性的shell
sudo docker run -i -t ubuntu /bin/bash
#docker ps命令
sudo docker ps #列出当前所有正在运行的container
sudo docker ps -l #列出最近一次启动的,且正在运行的container
sudo docker ps -a #列出所有的container
#port命令
docker run -p 80:8080 <image> <cmd> #映射容器的8080端口到宿主机的80端口
#删除容器命令
sudo docker rm `sudo docker ps -a -q`#删除所有容器
sudo docker rm $CONTAINER_ID#删除容器id为CONTAINER_ID的容器
#其他命令快速参考:
sudo docker images #查看本地镜像
sudo docker attach $CONTAINER_ID #启动一个已存在的docker实例
sudo docker stop $CONTAINER_ID #停止docker实例
sudo docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行
sudo docker inspect $CONTAINER_ID #查看container的实例属性,比如ip等等

猜你喜欢

转载自blog.csdn.net/qq_40012404/article/details/81026126