使用Docker完成新手,但概念仍然存在。
目标
在本地创建一个与我的prod EC2实例匹配的容器。升级PHP7并测试我的应用程序。
方法
我的第一步是创建一个基本的盒子亚马逊linux盒子。挂载它并从CLI运行命令。然后我可以慢慢构建命令以放入我的Dockerfile。
问题
我构建了精简版yum update -Y框并查看更新。但是,当我运行 docker ps 时,图片未列出?所以我无法装载它。我的composerfile如下......
FROM amazonlinux:2017.03
RUN yum update -y
为什么盒子没有处于打开状态?
答案 0 :(得分:3)
Docker容器在没有进程运行时停止。在Dockerfile中添加一个入口点以保持机器运行。
如果您确实没有任何流程可以运行,则可以执行sleep infinity
或sleep 99999
。
FROM amazonlinux:2017.03
RUN yum update -y
CMD [“sleep”, “infinity”]
答案 1 :(得分:2)
在所有RUN
命令完成后,docker容器停止运行。您需要CMD
或ENTRYPOINT
运行并且不会停止以保持容器的活动状态。对于Web服务,这可能是apache或nginx或您用于为PHP7应用程序提供服务的任何Web服务。
答案 2 :(得分:0)
我最终找到了另一种解决方案。通过启动BASH,我能够保持容器运行。
docker run -it -p 8080:80 --rm nbsite bash
答案 3 :(得分:0)
我在开发环境中测试实例的目标相同,起初我认为它应该像docker run amazonlinux:2 -it
一样容易。但是我错了,我花了整整一天的时间才能使它正常工作!
有趣的是,当您在Google中搜索“ amazonlinux Docker ”时,经常有人尝试在“ amazonlinux中安装“ Docker ”,但是在这里我们要安装“ amazonlinux”在Docker中”!
我们还希望在该amazonlinux中安装Docker,因此最终基本上就是“ Docker在amazonlinux中的Docker ”,即最终是“ Docker在Docker ”! ; D *
FROM amazonlinux:2
创建)非常空旷,甚至没有sudo
或passwd
之类的基本东西。)新的AWS EC2实例可以做到。 / li>
serviced
正常工作(启动任何守护程序,包括Docker守护程序),您需要在/usr/sbin/init
那里(通过yum install initscripts
并被实际调用。)您想玩的肉需要您的贝壳从/bin/bash
开始。docker run
从您--priviledged
中的主机特权。/sys/fs/cgroup
(它是只读的),以便它能够正确初始化docker daemon。1)为解决上述前两个问题,您的 Dockerfile 可以是:
FROM amazonlinux:2
RUN yum update -y && yum install -y initscripts;
CMD ["/usr/sbin/init"]
2)从中创建图像,例如docker build . -t ax1
3)然后,要解决上面的后两个问题,请运行从其分离的(在后台运行)容器进行特权化,并与您的/sys/fs/cgroup
共享卷。例如
docker run --name ac11 -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ax1
4)最后,您可以使用docker exec -it ac11 bash
5)现在,它与新的EC2实例非常接近。 (但是,缺少sudo
,实际的ec2-user
以及我们在Dockerfile中跳过的其他内容,以使此解决方案保持简单。)
无论如何,现在您可以按照AWS Docs的说明安装 docker
。也就是说,一旦进入容器,请执行以下操作:
amazon-linux-extras install -y docker;
然后重新启动一次docker服务:
service docker restart;
现在,docker ps
应该工作了!