如何在Centos7中使用Docker创建一个Centos

Docker是一个容器,好久好在它内存资源占用率低,不过我比较喜欢拿来做虚拟机用,就类似于VMWareWorkstation
接下来就来动手用docker创建第一个系统吧~~~
1、首先更新宿主机

1
# yum -y install update

2、然后下载docker

1
# yum -y install docker

3、启动docker

1
# systemctl start docker

4、把需要的镜像pull下来

1
# docker pull centos

5、运行镜像并对镜像进行配置,例如下载软件
要想在容器里面可以使用systemctl的话,需要配置这个

1
# docker run -tid --privileged centos:7.3.1611 init

然后再看下这个容器的ID是多少

1
# docker ps -a

接着进到这个容器里面就可以使用systemctl了

1
# docker exec -ti a85eb88634d6 /bin/bash

(以上做法通过ssh连接后还是没有权限使用systemctl,要想彻底有权限使用systemctl请看下面)

6、先创建一个docker_demo的文件夹,然后在里面touch一个Dockerfile,再对Dockerfile进行编写

1
2
3
4
# mkdir docker_demo
# cd docker_demo
# touch Dockerfile
# vi Dockerfile

然后把这段复制到Dockerfile里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM centos:7.5.1804  
ENV container docker
MAINTAINER StephenJose_Dai
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
RUN echo "root:123456"|chpasswd
EXPOSE 22
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

下面是相应大写命令介绍
(Dockerfile 命令)
【ADD
ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

1
2
# Usage: ADD [source directory or URL] [destination directory]  
ADD /my_app_folder /my_app_folder

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

1
2
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

1
2
3
4
5
6
7
8
# Usage: ENTRYPOINT application "argument", "argument", ..  
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

1
2
3
4
5
# Usage: ENV key value  
ENV SERVER_WORKS 4
```
EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

Usage: EXPOSE [port]

EXPOSE 8080

1
2
FROM
FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

Usage: FROM [image name]

FROM ubuntu
MAINTAINER

1
我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

Usage: MAINTAINER [name]

MAINTAINER authors_name

1
2
RUN    
RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

Usage: RUN [command]

RUN aptitude install -y riak

1
2
USER  
USER命令用于设置运行容器的UID。

Usage: USER [UID]

USER 751

1
2
VOLUME  
VOLUME命令用于让你的容器访问宿主机上的目录。

Usage: VOLUME [“/dir_1”, “/dir_2” ..]

VOLUME [“/my_files”]

1
2
WORKDIR
WORKDIR命令用于设置CMD指明的命令的运行目录。

Usage: WORKDIR /path

WORKDIR ~/】

1
复制到Dockerfile后直接build

docker build .

1
2
3

然后等待它自己下载镜像并执行相应命令即可
build好后先看下当前镜像

docker images

1
2

然后会发现有一个镜像名称和tag都是<none>的,我们要对它进行重命名

docker tag b7975fda2012 centos:7.5

1
2
3
4

其中b7975fda2012是<none>镜像的image id ,,centos:7.5中的centos是名称,7.5是tag,这句命令的意思是,把b7975fda2012这个镜像名称改为centos,tag改为7.5

接下来生成一个容器

docker run –privileged –name “testser” -tid -p 20:22 centos:7.5

1
2
3

其中testser是这个容器的名称,可以取一个自己喜欢的名称,-p是端口的命令,20是宿主机的端口,22是容器的端口,也就是说把宿主机20的端口转到到容器的22端口,当使用ssh的时候直接使用ssh 宿主机ip -p 20,例如宿主机ip为192.168.1.100,当ssh连接的时候需要这么做,ssh 192.168.1.210 -p 20,centos:7.5是创建容器是使用的镜像
这个时候可能会遇到报错 driver failed programming external connectivity,这个报错是因为宿主机在docker处于start状态时,管理员运行了systemctl stop firewalld将防火墙关闭了,导致docker规则被清空,这个时候,只需要restart docker就行

pkill docker

systemctl restart docker

docker run –privileged –name “testser” -tid -p 20:22 centos:7.5

1
2

容器创建完之后就可以进去配置了(systemctl有权限的那种)

docker exec -ti 8995a304e3d6 /bin/bash

1
2

进入到容器后先下载一个ssh并且启动它

yum -y install openssh*

systemctl restart sshd

1
2

接着使用ssh连接容器

ssh 192.168.1.210 -p 20

1
2
3
4
5
6

这个时候可能会有这种报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

![clipboard](/uploads/how_to_in-centos7_using_docker_build_one_centos/clipboard.png)

如果遇到这种报错,说明原来known_hosts是记录远程主机的公钥的文件,之前重装个系统,而保存的公钥还是未重装系统的系统公钥,在ssh链接的时候首先会验证公钥,如果公钥不对,那么就会报错,这个时候我们需要删除/root/.ssh/文件夹底下的密钥文件

cd /root/.ssh/

rm -rf know_hosts

1
2
3

再次连接后就不会报这个错误了
如果要让容器随着docker开机启动后也启动,可以使用一下命令

docker update –restart=always 容器ID(在创建容器时未指定开机启动的时候用)

docker run –privileged –name “testser” –restart=always -tid -p 20:22 centos:7.5(在创建容器时指定开机启动的时候用)

1
2
3
4

知识点:
删除镜像
先停止容器

docker ps -a

docker stop 容器ID

docker rm -f 容器ID

1
2

然后删除镜像

docker rmi 镜像ID

1
2

如果删除镜像的时候报image is referenced in multiple repositories 可以使用镜像名称来删除

docker rmi 镜像名称(例如:docker.io/centos:7)

1
2

这个时候可能会报容器正在使用,先停止容器然后再删除容器即可

docker ps -a

docker stop 容器ID

docker rm -f 容器ID

1
多端口映射

docker run –privileged –name “testser” -tid -p 80:80 -p 81:81 -p 82:82 centos:75

`

关注我的公众号吧~戴戴的Linux

文章目录
  1. 1. Usage: EXPOSE [port]
  2. 2. Usage: FROM [image name]
  3. 3. Usage: MAINTAINER [name]
  4. 4. Usage: RUN [command]
  5. 5. Usage: USER [UID]
  6. 6. Usage: VOLUME [“/dir_1”, “/dir_2” ..]
  7. 7. Usage: WORKDIR /path
  8. 8. docker build .
  9. 9. docker images
  10. 10. docker tag b7975fda2012 centos:7.5
  11. 11. pkill docker
  12. 12. systemctl restart docker
  13. 13. docker run –privileged –name “testser” -tid -p 20:22 centos:7.5
  14. 14. yum -y install openssh*
  15. 15. systemctl restart sshd
  16. 16. cd /root/.ssh/
  17. 17. rm -rf know_hosts
  18. 18. docker update –restart=always 容器ID(在创建容器时未指定开机启动的时候用)
  19. 19. docker run –privileged –name “testser” –restart=always -tid -p 20:22 centos:7.5(在创建容器时指定开机启动的时候用)
  20. 20. docker ps -a
  21. 21. docker stop 容器ID
  22. 22. docker rm -f 容器ID
  23. 23. docker rmi 镜像ID
  24. 24. docker ps -a
  25. 25. docker stop 容器ID
  26. 26. docker rm -f 容器ID
  27. 27. docker run –privileged –name “testser” -tid -p 80:80 -p 81:81 -p 82:82 centos:75


本站总访问量 本文总阅读量